“cookie是当前识别用户,实现持久会话的最好方式…最初是由网景公司开发的。”
Beego框架上下文模块中context对象对GetCookie和SetCookie进行了封装。
1、比如用户登陆成功后设置cookie
参数说明:
@Secret string 标识, 比如自己的网站, 应用名appName
@Token string 安全值, 比如8A66b76dbd3759445fe924d28a5F6856, 需要注意的时, 该值最好不要有@, ?等特殊字符, 下划线是支持的, 否则读取cookie可能为空
@Value string 设置的真实值, 比如用户id, 该值会被加密后存储
@Expires int64 过期时间, 该值最终会被转化为int64类型, 可能还会设置Max-Age字段
@Path string cookie有效的作用范围, 默认为”/“根目录
@Domain string 设置该值后浏览器只会向指定的域发送该cookie信息
@Secure bool 可能会使用https方式加密传输
@HttpOnly bool 设置后js等可能获取不到cookie信息
// Login 登陆
func (a *AuthController) Login() {
if a.Ctx.Request.Method == "POST" {
email := a.Input().Get("email")
password := a.Input().Get("password")
// 其它处理...
a.SetSecureCookie(Secret, Token, Value, Expires, Path, Domain, Secure, HttpOnly)
// 跳转...
}
a.TplName = "login.html"
}
2、获取cookie
// IsLogin 用户是否登陆, 无登陆直接跳转至登录页
func IsLogin(ctx *context.Context) (bool, User) {
// 假如之前存储的cookie为用户id, 返回值是一个string类型
userId, ok := ctx.GetSecureCookie(Secret, Token)
var user User
// 无cookie直接登录
if !ok {
ctx.Redirect(302, "/auth/login")
}
// 根据该cookie值尝试获取用户信息...
}
3、删除cookie
设置cookie值为空, 过期时间为-1即可。
// Logout 退出
func (a *AuthController) Logout() {
a.SetSecureCookie(Secret, Token, "", -1, Path, Domain, Secure, HttpOnly)
a.Redirect("/auth/login", 302)
}
“cookie是可以禁止的,而且可以通过日志分析或其他方式来实现大部分的跟踪记录,所以cookie自身并不是很大的安全隐患。实际上,可以通过提供一个标准的审查方法在远程数据库中保存个人信息,并将匿名的cookie作为键值,来降低客户端到服务器的敏感数据传送频率。”
“但是,潜在的滥用情况总是存在的,所以,在处理隐私和用户跟踪信息时,最好还是要小心一些。第三方Web站点使用持久cookie来跟踪用户就是一种最大的滥用。将这种做法与IP地址和Referer首部信息结合在一起,这些营销公司就可以构建起相当精确的用户档案和浏览模式信息。”
_《HTTP权威指南》