Đặt cookie bằng net / http


76

Tôi đang cố gắng đặt cookie bằng gói net / http của Go. Tôi có:

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

Tôi đã thử googling 'Golang' với 'cookies', nhưng không nhận được bất kỳ kết quả tốt nào. Nếu ai đó có thể chỉ cho tôi đi đúng hướng, điều đó sẽ được đánh giá rất cao.

Câu trả lời:


95

Tôi không phải là chuyên gia cờ vây, nhưng tôi nghĩ rằng bạn đang đặt cookie theo yêu cầu, phải không? Bạn có thể muốn đặt nó trên phản hồi. Có một setCookiechức năng trong net / http. Điều này có thể hữu ích: http://golang.org/pkg/net/http/#SetCookie

func SetCookie(w ResponseWriter, cookie *Cookie)

1
Cảm ơn. Điều đó có vẻ hiệu quả. Tôi đã nhầm lẫn nhìn golang.org/pkg/net/http/#Request.AddCookie trước
Tech163

13
Vâng, thật khó hiểu. Bạn sẽ cần Request.AddCookie nếu chương trình đi của bạn hoạt động như một máy khách HTTP và bạn muốn gửi một giá trị cookie đến máy chủ HTTP ...
Tobias N. Sasse

bạn có thể chỉ cách tạo cookie và đặt nó không?
Alexander Mills

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

Có sự khác biệt cơ bản giữa RequestsResponseWriter, Yêu cầu là những gì trình duyệt sẽ gửi

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

và phản hồi là những gì trình xử lý sẽ gửi, giống như:

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>

Khi trình duyệt đưa ra yêu cầu, trình duyệt sẽ bao gồm cookie cho miền đó, vì cookie là miền được lưu trữ khôn ngoan và không thể truy cập từ các miền chéo, nếu bạn đặt cookie là chỉ HTTP thì nó chỉ có thể được truy cập từ trang web đặt nó qua HTTP chứ không phải qua JS.

Vì vậy, khi lấy thông tin từ cookie, bạn có thể làm điều đó từ phương thức r.Cookie, như thế này

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

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

Nhưng khi bạn định đặt cookie, bạn phải thực hiện điều đó trong phương thức trình viết phản hồi, yêu cầu là đối tượng chỉ đọc mà chúng tôi phản hồi, hãy nghĩ về nó như một tin nhắn văn bản bạn nhận được từ ai đó, đó là một yêu cầu, bạn chỉ có thể lấy nó, những gì bạn nhập là một phản hồi, vì vậy bạn có thể nhập cookie tại

để biết thêm chi tiết: https://thewhitetulip.gitbooks.io/webapp-with-golang-anti-textbook/content/content/2.4workingwithform.html


1
trong trường hợp của tôi, bộ cookie không hoạt động nếu không đặt đường dẫn:http.Cookie{Name: "csrftoken",Value:"abcd",Expires:expiration, Path: "/"}
Maxim Yefremov

9

Đoạn mã dưới đây giúp bạn

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

7

Dưới đây cho thấy cách chúng tôi sử dụng cookie trong sản phẩm của mình:

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

Nó không hoạt động với tôi trong Safari cho đến khi tôi thêm Path và MaxAge. Cả cookie an toàn và thông thường đều phù hợp với tôi

Chia sẻ để nó giúp ích cho một người đang bế tắc như mình hơn 2 ngày nay :)

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
nhờ đó làm việc cho tôi quá, chỉ đưa con đường là đủ
CommonSenseCode

Cảm ơn deepakssn! Bạn là một vị cứu tinh!
kaus

4

Đầu tiên, bạn cần tạo Cookie và sau đó sử dụng hàm SetCookie () của gói http, bạn có thể đặt cookie.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.