2012-08-26 15 views
53

Estoy tratando de establecer cookies con la red/http de Golang. TengoConfiguración de cookies en Golang (net/http)

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

He intentado googlear 'Golang' con 'cookies', pero no he obtenido ningún buen resultado. Si alguien puede señalarme en la dirección correcta, sería muy apreciado.

Gracias.

Respuesta

68

No soy un experto en Go, pero creo que está configurando la cookie en la solicitud, ¿verdad? Es posible que desee configurarlo en la respuesta. Hay una función setCookie en net/http. Esto podría ayudar: http://golang.org/pkg/net/http/#SetCookie

func SetCookie(w ResponseWriter, cookie *Cookie) 
+1

Gracias.Eso parece funcionar. Estaba mirando erróneamente http://golang.org/pkg/net/http/#Request.AddCookie anteriormente – Tech163

+8

Sí, es confuso. Necesitaría Request.AddCookie si su programa go actúa como un cliente HTTP y desea enviar un valor de cookie al servidor HTTP ... –

5

Este continuación código ayuda u

cookie1 := &http.Cookie{Name: "sample", Value: "sample", HttpOnly: false} 
    http.SetCookie(w, cookie1) 
8
//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) 
    } 
} 

Hay una diferencia básica entre Requests y ResponseWriter, una solicitud es lo que un navegador enviará como

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 

y una respuesta es lo que el controlador enviará, algo así como:

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> 

Cuando el navegador hará una petición, incluiremos la cookie para ese dominio, ya que las cookies se almacenan dominio sabia y no se puede acceder a partir de dominios cruzados, si se establece una cookie como HTTP solo puede accederse desde el sitio web que lo establece a través de HTTP y no a través de JS.

Por eso, cuando la obtención de información de las cookies puede hacerlo a partir del método r.Cookie, como este

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

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

Pero cuando se va a establecer una cookie, usted tiene que hacerlo en el método del escritor de respuestas, la solicitud es un objeto de solo lectura al que respondemos, lo consideramos como un mensaje de texto que obtienes de alguien, es una solicitud, solo puedes obtenerlo, lo que escribes es una respuesta, por lo que puede escribir una cookie en

para más Detalles: https://thewhitetulip.gitbooks.io/webapp-with-golang-anti-textbook/content/content/2.4workingwithform.html

2

abajo muestra cómo la utilizamos cookies en nuestro producto:

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) 

    // ... 
} 
0

No estaba funcionando para mí en Safari hasta que agregué el Path y MaxAge. Tanto las cookies seguras y regulares trabajaron para mí

uso compartido de modo que ayude a alguien que está atrapado como yo durante más de 2 días :)

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) 
0

En primer lugar, es necesario crear la galleta y luego usando SetCookie del paquete http() función puede configurar la cookie.

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