2012-08-26 10 views
53

Sto tentando di impostare i cookie con la rete Golang/http. HoImpostazione dei cookie in Golang (rete/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) 
} 

Ho provato google "Golang" con "cookie", ma non ho ottenuto buoni risultati. Se qualcuno mi può indirizzare nella giusta direzione, sarebbe molto apprezzato.

Grazie.

risposta

68

Non sono un esperto di Go, ma penso che tu stia impostando il cookie sulla richiesta, non è vero? Potresti impostarlo sulla risposta. C'è una funzione in net/http. Questo potrebbe aiutare: http://golang.org/pkg/net/http/#SetCookie

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

Grazie.Sembra funzionare. Ho erroneamente guardato http://golang.org/pkg/net/http/#Request.AddCookie in precedenza – Tech163

+8

Sì, è confuso. Avresti bisogno di Request.AddCookie se il tuo programma go funge da client HTTP e vuoi inviare un valore cookie al server HTTP ... –

5

Questa Sotto codice consente 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) 
    } 
} 

C'è una differenza fondamentale tra Requests e ResponseWriter, una richiesta è ciò che un browser invierà come

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 

e una risposta è ciò che il gestore invierà, qualcosa come:

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> 

Quando il browser farà una richiesta, includeremo il cookie per il dominio, dal momento che i cookie vengono memorizzati dominio saggio e non è possibile accedere da domini incrociati, se si imposta un cookie come HTTP solo a quel punto è possibile accedervi solo dal sito Web che lo imposta tramite HTTP e non tramite JS.

Così, quando ottenere informazioni da cookie si può fare dal metodo r.Cookie, come questo

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

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

Ma quando si sta per impostare un cookie, devi farlo nel metodo del writer di risposta, la richiesta è un oggetto di sola lettura a cui rispondiamo, pensiamolo come un messaggio di testo che ricevi da qualcuno, che è una richiesta, puoi solo ottenerlo, ciò che scrivi è una risposta, quindi tu può digitare un cookie al

per ulteriori Dettagli: https://thewhitetulip.gitbooks.io/webapp-with-golang-anti-textbook/content/content/2.4workingwithform.html

2

sotto mostra come usiamo cookie nel nostro prodotto:

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

Non stava lavorando per me in Safari fino a quando ho aggiunto il percorso e MaxAge. Sia i cookie sicuri e regolari lavorato per me

condivisione in modo che aiuta qualcuno che è bloccato, come me, per più di 2 giorni :)

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

In primo luogo, è necessario creare cookie e quindi utilizzando SetCookie del pacchetto http() funzione è possibile impostare il cookie.

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