web-dev-qa-db-fra.com

Paramétrer les 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", []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é.

62
Tech163

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)
85
Tobias N. Sasse
//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

9
thewhitetulip

Ce code ci-dessous vous aide

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

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)

    // ...
}
4
Bill Xiong

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)
1
Kabeer Shaikh

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)
1
deepakssn