Встановлення файлів cookie за допомогою net / http


76

Я намагаюся встановити файли cookie за допомогою пакета net / http від Go. Я маю:

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

Я спробував погуглити "Голанг" із "печивом", але не отримав хороших результатів. Якщо хтось може вказати мені в правильному напрямку, це буде вдячне.

Відповіді:


95

Я не експерт Go, але я думаю, що ви встановлюєте файл cookie за запитом, чи не так? Можливо, ви захочете встановити його у відповіді. У setCookieмережі / http є функція. Це може допомогти: http://golang.org/pkg/net/http/#SetCookie

func SetCookie(w ResponseWriter, cookie *Cookie)

1
Дякую. Здається, це працює. Я помилково дивився на golang.org/pkg/net/http/#Request.AddCookie раніше
Tech163

13
Так, це бентежить. Вам знадобиться Request.AddCookie, якщо ваша програма go діє як клієнт HTTP і ви хочете надіслати значення файлу cookie на сервер HTTP ...
Tobias N. Sasse

Ви можете показати, як створити файл cookie та встановити його, будь ласка?
Олександр Міллс

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

Існує основна різниця між Requestsі ResponseWriter, Запит - це те, що браузер надсилатиме

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

а відповідь - це те, що обробник надішле, приблизно так:

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>

Коли браузер зробить запит, він буде включати файли cookie для цього домену, оскільки файли cookie зберігаються в домені і до них неможливо отримати доступ з міждоменів, якщо ви встановите файл cookie як HTTP, тоді до нього можна отримати доступ лише веб-сайт, який встановив його через HTTP, а не через JS.

Отже, отримуючи інформацію з файлів cookie, ви можете зробити це за допомогою методу r.Cookie, наприклад

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

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

Але коли ви збираєтеся встановлювати файли cookie, ви повинні це робити методом написання відповідей, запит - це об’єкт лише для читання, на який ми відповідаємо, сприймайте це як текстове повідомлення, яке ви отримуєте від когось, тобто запит, Ви можете отримати його лише те, що ви вводите, це відповідь, тому ви можете ввести файл cookie за адресою

докладніше: https://thewhitetulip.gitbooks.io/webapp-with-golang-anti-textbook/content/content/2.4workingwithform.html


1
у моєму випадку набір файлів cookie не спрацював без встановлення шляху:http.Cookie{Name: "csrftoken",Value:"abcd",Expires:expiration, Path: "/"}
Максим Єфремов


7

Нижче показано, як ми використовуємо файли cookie у своєму продукті:

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)

    // ...
}

5

Це не працювало для мене в Safari, поки я не додав Path і MaxAge. Мені працювали як безпечні, так і звичайні файли cookie

Спільний доступ, щоб це допомогло тому, хто застряг, як я, більше 2 днів :)

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! Ти рятівник!
kaus

4

Спочатку вам потрібно створити Cookie, а потім, використовуючи функцію SetCookie () пакета http, ви можете встановити cookie.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.