Настройка Cookies в Golang (net/http)
Я пытаюсь установить файлы 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)
}
Я попробовал googling 'Golang' с 'cookies', но не получил хороших результатов. Если кто-то может указать мне в правильном направлении, мы будем очень благодарны.
Спасибо.
Ответы
Ответ 1
Я не эксперт Go, но я думаю, что вы настраиваете cookie по запросу, не так ли. Возможно, вы захотите установить его в ответ. В net/http есть функция setCookie
. Это может помочь:
http://golang.org/pkg/net/http/#SetCookie
func SetCookie(w ResponseWriter, cookie *Cookie)
Ответ 2
//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
Ответ 3
Этот код ниже помогает u
cookie1 := &http.Cookie{Name: "sample", Value: "sample", HttpOnly: false}
http.SetCookie(w, cookie1)
Ответ 4
Ниже показано, как мы используем 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 работали для меня.
Разделите, чтобы он помог кому-то, кто застрял как мне больше двух дней:)
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)
Ответ 6
Вы можете использовать пакет gorilla для обработки файлов cookie или я бы назвал безопасные куки: http://www.gorillatoolkit.org/pkg/securecookie