1. Beego框架设置cookie

“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权威指南》