Setting cookies with net/http

前端 未结 7 1465
说谎
说谎 2020-12-12 23:12

I\'m trying to set cookies with Go\'s net/http package. I have:

package main

import \"io\"
import \"net/http\"
import \"time\"

func indexHandler(w http.Res         


        
7条回答
  •  情深已故
    2020-12-13 00:10

    //ShowAllTasksFunc is used to handle the "/" URL which is the default ons
    func ShowAllTasksFunc(w http.ResponseWriter, r *http.Request){
        if r.Method == "GET" {
            context := db.GetTasks("pending") //true when you want non deleted notes
            if message != "" {
                context.Message = message
            }
            context.CSRFToken = "abcd"
            message = ""
            expiration := time.Now().Add(365 * 24 * time.Hour)
            cookie    :=    http.Cookie{Name: "csrftoken",Value:"abcd",Expires:expiration}
            http.SetCookie(w, &cookie)
            homeTemplate.Execute(w, context)
        } else {
            message = "Method not allowed"
            http.Redirect(w, r, "/", http.StatusFound)
        }
    }
    

    There is a basic difference between Requests and ResponseWriter, a Request is what a browser will send like

    Host: 127.0.0.1:8081
    User-Agent: ...
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate
    DNT: 1
    Referer: http://127.0.0.1:8081/
    Cookie: csrftoken=abcd
    Connection: keep-alive
    

    and a response is what the handler will send, something like :

    Content-Type: text/html; charset=utf-8
    Date: Tue, 12 Jan 2016 16:43:53 GMT
    Set-Cookie: csrftoken=abcd; Expires=Wed, 11 Jan 2017 16:43:53 GMT
    Transfer-Encoding: chunked
    ...
    

    When the browser will make a request, it'll include the cookie for that domain, since cookies are stored domain wise and can't be accessed from cross domains, if you set a cookie as HTTP only then it can only be accessed from the website which set it via HTTP and not via JS.

    So when getting information from cookies you can do that from the r.Cookie method, like this

    cookie, _ := r.Cookie("csrftoken")
    if formToken == cookie.Value {
    

    https://github.com/thewhitetulip/Tasks/blob/master/views/addViews.go#L72-L75

    But when you are going to set a cookie, you have to do it in the response writer method, the request is a read only object which we respond to, think of it as a text message you get from someone, that is a request, you can only get it, what you type is a response, so you can type in a cookie at

    for more details: https://thewhitetulip.gitbooks.io/webapp-with-golang-anti-textbook/content/content/2.4workingwithform.html

提交回复
热议问题