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.
//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
Requests
undResponseWriter
, eine Anfrage ist, wie ein Browser sendetHost: 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
quelle
http.Cookie{Name: "csrftoken",Value:"abcd",Expires:expiration, Path: "/"}
Dieser folgende Code hilft u
cookie1 := &http.Cookie{Name: "sample", Value: "sample", HttpOnly: false} http.SetCookie(w, cookie1)
quelle
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) // ... }
quelle
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)
quelle
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)
quelle
Sie können das Gorilla-Paket für den Umgang mit Cookies verwenden, oder ich würde sagen, sichere Cookies: http://www.gorillatoolkit.org/pkg/securecookie
quelle