cookie 由服务器设置
session 和 cookie 的目的相同,都是为了克服 http 协议无状态的缺陷,但完 成的方法不同。session 通过 cookie,在客户端保存 session id,而将用户的其他会话消息 保存在服务端的 session 对象中,与此相对的,cookie 需要将所有信息都保存在客户端。因 此 cookie 存在着一定的安全隐患,例如本地 cookie 中保存的用户名密码被破译,或 cookie 被其他网站收集(例如:1. appA 主动设置域 B cookie,让域 B cookie 获取;2. XSS,在 appA 上通过 javascript 获取 document.cookie,并传递给自己的 appB)。
通过上面的一些简单介绍我们了解了 cookie 和 session 的一些基础知识,知道他们之间的 联系和区别,做 web 开发之前,有必要将一些必要知识了解清楚,才不会在用到时捉襟见 肘,或是在调 bug 时候如无头苍蝇乱转。接下来的几小节我们将详细介绍 session 相关的知 识。
package main
import (
"net/http"
)
func SayHello(w http.ResponseWriter, req *http.Request) {
w.Write([]byte("Hello"))
}
func ReadCookieServer(w http.ResponseWriter, req *http.Request) {
// read cookie
cookie, err := req.Cookie("testcookiename")
if err == nil {
cookievalue := cookie.Value
w.Write([]byte("<b>cookie的值是:" + cookievalue + "</b>\n"))
} else {
w.Write([]byte("<b>读取出现错误:" + err.Error() + "</b>\n"))
}
}
func WriteCookieServer(w http.ResponseWriter, req *http.Request) {
cookie := http.Cookie{Name: "testcookiename", Value: "testcookievalue", Path: "/", MaxAge: 86400}
http.SetCookie(w, &cookie)
w.Write([]byte("<b>设置cookie成功。</b>\n"))
}
func DeleteCookieServer(w http.ResponseWriter, req *http.Request) {
cookie := http.Cookie{Name: "testcookiename", Path: "/", MaxAge: -1}
http.SetCookie(w, &cookie)
w.Write([]byte("<b>删除cookie成功。</b>\n"))
}
func main() {
http.HandleFunc("/", SayHello)
http.HandleFunc("/readcookie", ReadCookieServer)
http.HandleFunc("/writecookie", WriteCookieServer)
http.HandleFunc("/deletecookie", DeleteCookieServer)
http.ListenAndServe(":80", nil)
}
有疑问加站长微信联系(非本文作者)