Go web开发设置cookie后立即读取报错Named cookie not present排查
问题根本原因
Cookie的生效流程和你预期的不一致:
- 你调用的
http.SetCookie(w, &cookie)只会把Set-Cookie字段写入本次请求的响应头缓冲区,此时Cookie还没有发送到浏览器,也不会被浏览器存储。 r.Cookie()读取的是本次浏览器发起请求时,主动携带在请求头里的Cookie内容,本次响应里新增的Cookie不可能出现在当前请求的Cookie列表中。
你在同一个请求处理逻辑里先设置响应Cookie,马上读取请求Cookie,自然读不到,这个错误和浏览器是否开启Cookie没有任何关系。
要实现浏览器Cookie可用性检测,需要两次请求交互:
- 用户首次访问时,服务端设置测试Cookie,同时返回重定向响应到检测路径
- 浏览器收到响应后如果开启了Cookie,会自动存储测试Cookie,并且携带该Cookie发起对检测路径的请求
- 检测路径的处理逻辑读取请求里的测试Cookie,能读到则说明Cookie可用,读不到则说明浏览器禁用了Cookie
示例核心代码:
router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { // 生成测试Cookie cookieName := "test_cookie" cookieValue := strconv.FormatInt(time.Now().UnixNano(), 10) cookie := http.Cookie{Name: cookieName, Value: cookieValue, Path: "/"} http.SetCookie(w, &cookie) // 重定向到检测接口 http.Redirect(w, r, "/check-cookie", http.StatusFound) }) router.HandleFunc("/check-cookie", func(w http.ResponseWriter, r *http.Request) { _, err := r.Cookie("test_cookie") if err != nil { fmt.Println("浏览器禁用了Cookie") // 返回提示页面 w.Write([]byte("请开启Cookie后访问")) return } fmt.Println("浏览器支持Cookie") // 正常返回站点内容 err = tmpl.ExecuteTemplate(w, "index", "") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } })
内容的提问来源于stack exchange,提问作者pigfox
相关产品推荐
相关产品推荐

