命名 cookie 不存在
Named cookie not present
我正在建立一个网站,该网站将依靠 cookie 来处理各种事情。
然后我决定有一个设置 cookie 的函数,然后读取相同的 cookie 以查看浏览器是否允许 cookie。
但这失败了。
./views/index.html
中的模板
{{define "index"}}template{{end}}
主要代码:
package main
import (
"fmt"
"html/template"
"log"
"net/http"
"strconv"
"time"
"github.com/gorilla/handlers"
"github.com/gorilla/mux"
)
var tmpl *template.Template
func main(){
port :=":8088"
router := mux.NewRouter()
router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
//Set test cookie
cookieName := strconv.FormatInt(time.Now().UnixNano(), 10)
cookieValue := strconv.FormatInt(time.Now().UnixNano(), 10)
fmt.Println("cookieName:" + cookieName)
fmt.Println("cookieValue:" + cookieValue)
cookie := http.Cookie{Name: cookieName, Value: cookieValue, Path: "/"}
http.SetCookie(w, &cookie)
//Get cookies
fmt.Println("Range over cookies")
for _, c := range r.Cookies() {
fmt.Println(c)
}
//Get test cookie by name
c, err := r.Cookie(cookieName)
if err != nil {
fmt.Println("Error: " + err.Error())
} else {
fmt.Println(c.Value)
}
err = tmpl.ExecuteTemplate(w, "index", "")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
})
var err error
tmpl, err = template.ParseGlob("views/*")
if err != nil {
panic(err.Error())
}
router.PathPrefix("/").HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
http.FileServer(http.Dir("./static/")).ServeHTTP(res, req)
})
fmt.Println("Server running on localhost" + port)
err = http.ListenAndServe(port, handlers.CompressHandler(router))
if err != nil {
log.Fatal(err)
}
}
这是终端输出:
Server running on localhost:8088
cookieName:1636243636497412077
cookieValue:1636243636497413613
Range over cookies
Error: http: named cookie not present
有任何关于我的问题的指示吗?
您在将 cookie 发送给客户端之前正在检查 r.Cookies。您必须发送 cookie,然后如果您想检查他们的 cookie,请发送第二个请求。在您发送第一个回复后打开浏览器并查看您的 cookie 是否存在会容易得多。
方法Request.Cookie gets a cookie from request Cookie headers.
函数http.SetCookie adds a Set-Cookie header to the response headers。您可以使用以下代码观察 http.SetCookie 的结果:
fmt.Println(w.Header()["Set-Cookie"])
当前请求中不存在指定的 cookie,因为 http.SetCookie 不修改当前请求。
cookie 值的流程是这样的:
- 服务器使用 Set-Cookie header.
在响应中设置 cookie
- 客户端将 cookie 存储在“cookie jar”中。
- 客户端使用 Cookie 请求将 jar 中的匹配 cookie 添加到请求中 header。
- 服务器从请求 headers 中获取 cookie。
试试这个代码。在浏览器中加载页面并刷新以观察 cookie 值的流动。
const cookieName = "example"
cookieValue := strconv.FormatInt(time.Now().UnixNano(), 10)
fmt.Printf("Set cookie %s=%s\n", cookieName, cookieValue)
cookie := http.Cookie{Name: cookieName, Value: cookieValue, Path: "/"}
http.SetCookie(w, &cookie)
c, err := r.Cookie(cookieName)
if err != nil {
fmt.Printf("Get cookie %s error: %v\n", cookieName, err)
} else {
fmt.Printf("Get cookie %s=%s\n", cookieName, c.Value)
}
我正在建立一个网站,该网站将依靠 cookie 来处理各种事情。 然后我决定有一个设置 cookie 的函数,然后读取相同的 cookie 以查看浏览器是否允许 cookie。 但这失败了。
./views/index.html
中的模板{{define "index"}}template{{end}}
主要代码:
package main
import (
"fmt"
"html/template"
"log"
"net/http"
"strconv"
"time"
"github.com/gorilla/handlers"
"github.com/gorilla/mux"
)
var tmpl *template.Template
func main(){
port :=":8088"
router := mux.NewRouter()
router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
//Set test cookie
cookieName := strconv.FormatInt(time.Now().UnixNano(), 10)
cookieValue := strconv.FormatInt(time.Now().UnixNano(), 10)
fmt.Println("cookieName:" + cookieName)
fmt.Println("cookieValue:" + cookieValue)
cookie := http.Cookie{Name: cookieName, Value: cookieValue, Path: "/"}
http.SetCookie(w, &cookie)
//Get cookies
fmt.Println("Range over cookies")
for _, c := range r.Cookies() {
fmt.Println(c)
}
//Get test cookie by name
c, err := r.Cookie(cookieName)
if err != nil {
fmt.Println("Error: " + err.Error())
} else {
fmt.Println(c.Value)
}
err = tmpl.ExecuteTemplate(w, "index", "")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
})
var err error
tmpl, err = template.ParseGlob("views/*")
if err != nil {
panic(err.Error())
}
router.PathPrefix("/").HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
http.FileServer(http.Dir("./static/")).ServeHTTP(res, req)
})
fmt.Println("Server running on localhost" + port)
err = http.ListenAndServe(port, handlers.CompressHandler(router))
if err != nil {
log.Fatal(err)
}
}
这是终端输出:
Server running on localhost:8088
cookieName:1636243636497412077
cookieValue:1636243636497413613
Range over cookies
Error: http: named cookie not present
有任何关于我的问题的指示吗?
您在将 cookie 发送给客户端之前正在检查 r.Cookies。您必须发送 cookie,然后如果您想检查他们的 cookie,请发送第二个请求。在您发送第一个回复后打开浏览器并查看您的 cookie 是否存在会容易得多。
方法Request.Cookie gets a cookie from request Cookie headers.
函数http.SetCookie adds a Set-Cookie header to the response headers。您可以使用以下代码观察 http.SetCookie 的结果:
fmt.Println(w.Header()["Set-Cookie"])
当前请求中不存在指定的 cookie,因为 http.SetCookie 不修改当前请求。
cookie 值的流程是这样的:
- 服务器使用 Set-Cookie header. 在响应中设置 cookie
- 客户端将 cookie 存储在“cookie jar”中。
- 客户端使用 Cookie 请求将 jar 中的匹配 cookie 添加到请求中 header。
- 服务器从请求 headers 中获取 cookie。
试试这个代码。在浏览器中加载页面并刷新以观察 cookie 值的流动。
const cookieName = "example"
cookieValue := strconv.FormatInt(time.Now().UnixNano(), 10)
fmt.Printf("Set cookie %s=%s\n", cookieName, cookieValue)
cookie := http.Cookie{Name: cookieName, Value: cookieValue, Path: "/"}
http.SetCookie(w, &cookie)
c, err := r.Cookie(cookieName)
if err != nil {
fmt.Printf("Get cookie %s error: %v\n", cookieName, err)
} else {
fmt.Printf("Get cookie %s=%s\n", cookieName, c.Value)
}