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", []string{"test=tcookie"}}
req.AddCookie(&cookie)
io.WriteString(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 obtenu de bons résultats. Si quelqu'un pouvait me diriger dans la bonne direction, ce serait grandement apprécié.
Je ne suis pas un expert de Go, mais je pense que vous définissez le cookie à la demande, n'est-ce pas? Vous voudrez peut-être le définir sur la réponse. Il existe 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 demande est ce qu'un navigateur va envoyer 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 va envoyer, 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
<html>...</html>
Lorsque le navigateur fait une demande, il inclut le cookie pour ce domaine, car 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, vous ne pourrez y accéder que depuis le répertoire. site Web qui le définit via HTTP et non via JS.
Ainsi, 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 allez définir un cookie, vous devez le faire dans la méthode du rédacteur de la réponse, la demande est un objet en lecture seule auquel nous répondons, que nous considérons comme un message texte que vous recevez de quelqu'un, c'est une demande, vous ne pouvez l'obtenir que ce que vous tapez est une réponse, vous pouvez donc taper un cookie à l'adresse
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)
Vous trouverez ci-dessous comment nous utilisons les 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)
// ...
}
Vous devez d’abord 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)
Cela ne fonctionnait pas pour moi dans Safari avant l’ajout de Path et de MaxAge. Les cookies sécurisés et réguliers ont fonctionné pour moi
Partage afin 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)