Définition des cookies avec net / http

J’essaie de définir des cookies avec le package net / http de Go. J’ai:

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", []ssortingng{"test=tcookie"}} req.AddCookie(&cookie) io.WriteSsortingng(w, "Hello world!") } func main() { http.HandleFunc("/", indexHandler) http.ListenAndServe(":80", nil) } 

J’ai essayé de googler «Golang» avec des «cookies», mais je n’ai pas eu de bons résultats. Si quelqu’un peut me diriger dans la bonne direction, cela serait grandement apprécié.

Je ne suis pas un expert de Go, mais je pense que vous définissez le cookie sur la demande, n’est-ce pas? Vous voudrez peut-être le définir sur la réponse. Il y a une fonction setCookie dans net / http. Cela pourrait aider: http://golang.org/pkg/net/http/#SetCookie

 func SetCookie(w ResponseWriter, cookie *Cookie) 
 //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) } } 

Il y a une différence fondamentale entre Requests et ResponseWriter , une requête est ce qu’un navigateur envoie comme

 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 

et une réponse est ce que le gestionnaire enverra, quelque chose comme:

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

Lorsque le navigateur effectuera une requête, il inclura le cookie pour ce domaine, étant donné que les cookies sont stockés par domaine et ne sont pas accessibles depuis plusieurs domaines, si vous définissez un cookie en tant que HTTP uniquement, vous ne pourrez y accéder qu’à partir du domaine. site Web qui le définit via HTTP et non via JS.

Donc, lorsque vous obtenez des informations à partir de cookies, vous pouvez le faire à partir de la méthode r.Cookie, comme ceci

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

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

Mais lorsque vous définissez un cookie, vous devez le faire dans la méthode de réponse, la requête est un object en lecture seule auquel nous répondons, pensez-y comme un message texte que vous recevez de quelqu’un, c’est-à-dire une requête, vous ne pouvez l’obtenir que ce que vous tapez est une réponse, vous pouvez donc saisir un cookie à

pour plus de détails: https://thewhitetulip.gitbooks.io/webapp-with-golang-anti-textbook/content/content/2.4workingwithform.html

Ce code ci-dessous vous aide

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

Ci-dessous montre comment nous utilisons des cookies dans notre produit:

 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) // ... } 

Cela n’a pas fonctionné pour moi dans Safari jusqu’à ce que j’ajoute le chemin et le MaxAge. Les deux cookies sécurisés et réguliers ont fonctionné pour moi

Partager pour que cela aide quelqu’un qui est coincé comme moi pendant plus de 2 jours 🙂

 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) 

Tout d’abord, vous devez créer un cookie, puis utiliser la fonction SetCookie () du package http pour définir le cookie.

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

Vous pouvez utiliser le paquet gorilla pour gérer les cookies ou, à mon avis, les cookies sécurisés: http://www.gorillatoolkit.org/pkg/securecookie