Настройка cookies с помощью net / http
Я пытаюсь установить куки с пакетом Go 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)
}
Я попытался погуглить 'Golang' с 'cookies', но не получил никаких хороших результатов. Если кто-то может мне точку в правильном направлении будет принята с благодарностью.
7 ответов:
Я не эксперт Go, но я думаю, что вы устанавливаете Куки по запросу, не так ли? Вы можете установить его на ответ. Там есть
setCookieфункция в net / http. Это может помочь: http://golang.org/pkg/net/http/#SetCookiefunc SetCookie(w ResponseWriter, cookie *Cookie)
//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>когда браузер сделает запрос, он будет включать куки для этого домена, так как куки хранятся в домене wise и не могут быть доступны из кросс-доменов, если вы установите куки как 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, вы должны сделать это в методе записи ответов, запрос - это объект только для чтения, на который мы отвечаем, думайте об этом как о текстовом сообщении, которое вы получаете от кого-то, то есть запрос, вы можете только получите его, что вы вводите ответ, так что вы можете ввести куки в
для более подробной информации: https://thewhitetulip.gitbooks.io/webapp-with-golang-anti-textbook/content/content/2.4workingwithform.html
Это ниже код помогает u
cookie1 := &http.Cookie{Name: "sample", Value: "sample", HttpOnly: false} http.SetCookie(w, cookie1)
ниже показано, как мы используем 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) // ... }
Он не работал для меня в Safari, пока я не добавил путь и MaxAge. Как безопасные, так и обычные куки работали для меня
обмен так, что это помогает кому-то, кто застрял, как я более 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)
во-первых, вам нужно создать 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)
вы можете использовать пакет gorilla для обработки куки или я бы сказал, безопасные куки:http://www.gorillatoolkit.org/pkg/securecookie
Comments