前言
在选择session和cookie时,考虑session位于服务器端,而cookie位于用户浏览器端,session的安全性更高。现在更多时候,写网站后台选择用session来保持会话状态。使用session时,我自己封装过一次session包,写的过程比较复杂,花了几天时间,而github.com/gin-contrib/sessions
这个包可以直接调用即可(自己封装session包是一次对原理的深入理解,但在做项目时其实不用花时间去封装…)
关于session包我写的一点点使用说明:github.com/gin-contrib/sessions
而cookie用起来就很简单了,这篇讲cookie最常用的运用,包直接引入的是net/http
,也就是说不需要再多引入其他包来完成了。
使用编辑器及测试工具
vscode、chrome、postman(非常推荐的请求调试工具)
cookie测试函数
设置cookie
func setCookieHandler(c *gin.Context) {
test_cookie := &http.Cookie{
Name: "test_cookie",
Value: "username",
Path: "/",
HttpOnly: false,
MaxAge: 3600,
}
c.Writer.Header().Set("Set-Cookie", test_cookie.String())
//http.SetCookie(c.Writer,test_cookie)
}
跨路由获取cookie
在另一个路由下获取生成的cookie值
func getCookieHandler(c *gin.Context) {
test_cookie, _ := c.Request.Cookie("test_cookie")
fmt.Println(test_cookie)
}
在登录函数写cookie
在/login
中写cookie,将生成的cookie存储到浏览器端,保持会话状态,方便后续获取cookie参数
username := c.PostForm("username")
password := c.PostForm("password")
fmt.Println("Server reveive data:", username, password)
uid_cookie := &http.Cookie{
Name: "uid",
Value: username,
HttpOnly: false,
MaxAge: 3600,
}
c.Writer.Header().Set("Set-Cookie", uid_cookie.String())
然后登录一个用户名试试
获取cookie的方法和前面测试中的方法一致…就不再阐述了
安全问题
" 对于开发者,cookie的是web开发里程上的一大发明,cookie是小甜点,绝不是恶魔。但是,如果使用不当,小甜点发霉了一样会有毒。"
但是我们发现cookie设置为我们真实的id,未加密cookie让安全问题难以得到保障,所以要对cookie进行加密存储,这个环节也非常关键,github.com/gorilla/securecookie
包可以提供一个HashKey
var hashKey = []byte("very-secret")
var s = securecookie.New(hashKey, nil)
encoded,_:=s.Encode("test_cookie","test_cookie")
参考资料
cookie
的加密解密:Go 实现安全 cookiecookie
的使用教程: Golang Cookie 简介、浅谈golang的http cookie用法Cookie/Session
机制详解: Cookie/Session机制详解