func ShowAllTasksFunc(w http.ResponseWriter, r *http.Request){
if r.Method == "GET" {
context := db.GetTasks("pending")
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 Requests
và ResponseWriter
, 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,*
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