Setzen von Cookies mit net / http

76

Ich versuche, Cookies mit dem net / http-Paket von Go zu setzen. Ich habe:

package main

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

func indexHandler(w http.ResponseWriter, req *http.Request) {
    expire := time.Now().AddDate(0, 0, 1)
    cookie := http.Cookie{"test", "tcookie", "/", "www.domain.com", expire, expire.Format(time.UnixDate), 86400, true, true, "test=tcookie", []string{"test=tcookie"}}
    req.AddCookie(&cookie)
    io.WriteString(w, "Hello world!")
}

func main() {
    http.HandleFunc("/", indexHandler)
    http.ListenAndServe(":80", nil)
}

Ich habe versucht, 'Golang' mit 'Keksen' zu googeln, aber keine guten Ergebnisse erzielt. Wenn jemand mich in die richtige Richtung weisen kann, wäre er sehr dankbar.

Tech163
quelle

Antworten:

95

Ich bin kein Go-Experte, aber ich denke, Sie setzen den Cookie auf die Anfrage, nicht wahr? Möglicherweise möchten Sie es für die Antwort festlegen. Es gibt eine setCookieFunktion in net / http. Dies könnte helfen: http://golang.org/pkg/net/http/#SetCookie

func SetCookie(w ResponseWriter, cookie *Cookie)
Tobias N. Sasse
quelle
1
Vielen Dank. Das scheint zu funktionieren. Ich habe fälschlicherweise golang.org/pkg/net/http/#Request.AddCookie früher angesehen
Tech163
12
Ja, es ist verwirrend. Sie würden Request.AddCookie benötigen, wenn Ihr go-Programm als HTTP-Client fungiert und Sie einen Cookie-Wert an den HTTP-Server senden möchten ...
Tobias N. Sasse
Können Sie zeigen, wie Sie das Cookie erstellen und es bitte setzen?
Alexander Mills
15
//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)
    }
}

Es gibt einen grundlegenden Unterschied zwischen Requestsund ResponseWriter, eine Anfrage ist, wie ein Browser sendet

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

und eine Antwort ist, was der Handler senden wird, so etwas wie:

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
<html>...</html>

Wenn der Browser eine Anfrage stellt, enthält er das Cookie für diese Domain, da Cookies domänenweise gespeichert werden und nicht domänenübergreifend aufgerufen werden können. Wenn Sie ein Cookie nur als HTTP festlegen, kann nur über das Cookie darauf zugegriffen werden Website, die es über HTTP und nicht über JS eingestellt.

Wenn Sie also Informationen von Cookies erhalten, können Sie dies mit der r.Cookie-Methode wie folgt tun

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

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

Wenn Sie jedoch ein Cookie setzen möchten, müssen Sie dies in der Antwortschreibmethode tun. Die Anfrage ist ein schreibgeschütztes Objekt, auf das wir antworten. Stellen Sie sich das als eine Textnachricht vor, die Sie von jemandem erhalten. Das ist eine Anfrage. Sie können es nur erhalten, was Sie eingeben, ist eine Antwort, also können Sie ein Cookie unter eingeben

Für weitere Informationen: https://thewhitetulip.gitbooks.io/webapp-with-golang-anti-textbook/content/content/2.4workingwithform.html

thewhitetulip
quelle
1
In meinem Fall funktionierte das Cookie-Set nicht, ohne einen Pfad http.Cookie{Name: "csrftoken",Value:"abcd",Expires:expiration, Path: "/"}
Maxim Yefremov
9

Dieser folgende Code hilft u

    cookie1 := &http.Cookie{Name: "sample", Value: "sample", HttpOnly: false}
    http.SetCookie(w, cookie1)
Dharani Dharan
quelle
6

Unten sehen Sie, wie wir Cookies in unserem Produkt verwenden:

func handleFoo(w http.ResponseWriter, r *http.Request) {

    // cookie will get expired after 1 year 
    expires := time.Now().AddDate(1, 0, 0)

    ck := http.Cookie{
        Name: "JSESSION_ID",
        Domain: "foo.com",
        Path: "/",
        Expires: expires,
    }

    // value of cookie    
    ck.Value = "value of this awesome cookie"

    // write the cookie to response
    http.SetCookie(w, &ck)

    // ...
}
Bill Xiong
quelle
5

In Safari hat es nicht funktioniert, bis ich Path und MaxAge hinzugefügt habe. Sowohl sichere als auch regelmäßige Cookies haben bei mir funktioniert

Teilen, damit es jemandem hilft, der länger als 2 Tage wie ich feststeckt :)

expire := time.Now().Add(20 * time.Minute) // Expires in 20 minutes
cookie := http.Cookie{Name: "username", Value: "nonsecureuser", Path: "/", Expires: expire, MaxAge: 86400}
http.SetCookie(w, &cookie)
cookie = http.Cookie{Name: "secureusername", Value: "secureuser", Path: "/", Expires: expire, MaxAge: 86400, HttpOnly: true, Secure: true}
http.SetCookie(w, &cookie)
deepakssn
quelle
1
Danke, das hat auch für mich funktioniert, nur den Pfad zu setzen war genug
CommonSenseCode
Danke deepakssn! Du bist ein Retter!
Kaus
4

Zuerst müssen Sie ein Cookie erstellen und dann mit der SetCookie () -Funktion des http-Pakets das Cookie setzen.

expire := time.Now().Add(10 * time.Minute) 
cookie := http.Cookie{Name: "User", Value: "John", Path: "/", Expires: expire, MaxAge: 90000}
http.SetCookie(w, &cookie)
Kabeer Shaikh
quelle