2012-08-26 30 views
53

Tôi đang cố gắng đặt cookie bằng mạng/http của Golang. Tôi cóĐặt cookie ở 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) 
} 

Tôi đã thử googling 'Golang' bằng 'cookie' nhưng không nhận được kết quả tốt. Nếu bất cứ ai có thể chỉ cho tôi đúng hướng nó sẽ được đánh giá cao.

Cảm ơn.

Trả lời

68

Tôi không phải là chuyên gia về Go, nhưng tôi nghĩ bạn đang đặt cookie theo yêu cầu, đúng không. Bạn có thể muốn đặt nó trên phản hồi. Có một hàm setCookie trong net/http. Điều này có thể giúp: http://golang.org/pkg/net/http/#SetCookie

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

Cảm ơn.Điều đó dường như hoạt động. Tôi đã nhầm lẫn khi nhìn vào http://golang.org/pkg/net/http/#Request.AddCookie trước đó – Tech163

+8

Yeah nó 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 ... –

5

này Dưới đây đang giúp 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ó một sự khác biệt cơ bản giữa RequestsResponseWriter, một yêu cầu là những gì một trình duyệt sẽ gửi như

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à điều mà người xử lý sẽ gửi cho, cái gì đó 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 sẽ gửi một yêu cầu, nó sẽ bao gồm cookie cho tên miền đó, kể từ khi cookie được lưu trữ miền khôn ngoan và không thể được truy cập từ các tên miền chéo, nếu bạn thiết lập một cookie như HTTP chỉ sau đó nó chỉ có thể được truy cập từ trang web mà thiết lập nó thông qua HTTP và không thông qua JS.

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

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

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

này Nhưng khi bạn đang đi để thiết lập một cookie, bạn phải làm điều đó trong phương thức người viết phản hồi, yêu cầu là đối tượng chỉ đọc mà chúng tôi trả lời, coi đó là tin nhắn văn bản bạn nhận được từ ai đó, đó là yêu cầu, bạn chỉ có thể nhận được, nội dung bạn nhập là phản hồi, vì vậy bạn có thể nhập cookie vào

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

2

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

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

Nó không được làm việc cho tôi trong Safari cho đến khi tôi thêm Path và MaxAge. Cả hai cookie an toàn và thường xuyên làm việc cho tôi

Sharing để nó giúp một người đang bị mắc kẹt như tôi trong hơn 2 ngày :)

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

Trước tiên, bạn cần phải tạo ra Cookie và sau đó sử dụng setcookie http gói của() chức năng bạn có thể thiết lập các cookie.

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