原文:https://blog.csdn.net/yang731227/article/details/82263125
title: Beego脱坑(九)Cookie和Session
tags: go,beego
author: Clown95
Cookie
1.Http是无状态的协议,服务器不能记录浏览器的访问状态,也就是服务器不能区分两次请求是否是来自同一个客户端。
2.Cookie实际上是服务器保存在浏览器上的一段信息,浏览器有了Cookie之后,每次向服务器发送请求都会带着该信息进行访问,服务器在收到请求之后,就可以通过该信息进行处理。
3.Cookie由服务器创建,并发给浏览器,最终由浏览器保存。
Cookie的用途
保持用户登陆状态
电商网站的购物车
设置Cookie
使用beego.Router()注册路由
beego.Router("/cookie",&controllers.CookieController{})
设置Cookie控制器以及Get方法
package controllers
import "github.com/astaxie/beego"
type CookieController struct {
beego.Controller
}
func (this *CookieController)Get() {
if this.Ctx.GetCookie("user") ==""{
this.Ctx.SetCookie("user","admin")
this.Ctx.WriteString("Cookie设置成功")
}else{
user:= this.Ctx.GetCookie("user")
this.Ctx.WriteString("user="+user)
}
}
运行结果
我们先通过GetCookie判断浏览器是否有Cookie ,如果没有就使用SetCookie设置,如果有就获取并输出。
SetCookie 参数一为cookie的名称,参数二为cookie的值
设置Cookie是不能存在中文的,如果存在中文虽然可以设置成功,但是不能取出。
为Cookie设置存活时间
this.Ctx.SetCookie("user","admin",10)
SetCookie的第三个参数是时间,单位是秒 。
如果不设置时间,Cookie只在本次回话有效,默认存活时间为3600秒
为Cookie设置路径
this.Ctx.SetCookie("user","admin",nil,"/cookie")
第三个参数是cookie的设置路径
Cookie的路径是指告诉浏览器在访问那些网站的时候会带上该Cookie
我们访问的网站必须是Cookie保存路径的子集时才会带上相应的Cookie。
如果只想设置Cookie的保存路径而不想设置存活时间,可以在第三个参数中传递nil。
删除Cookie
beego中并没有删除Cookie的函数,但是我们可通过SetCookie把Cookie设为空值,即可达成删除的效果。
Cookie的缺点
Cookie使用明文存储安全性差,可以直接查看浏览器获得。
可以在浏览器禁止Cookie,这样用户状态依然无法保存。
Cookie作为请求或响应的报文进行发送,无形中增加了网络流量。
各个浏览器对Cookie有限制,大概只能保存每个网站的20个cookie。
Session
Session是一段保存在服务器上的信息,当客户端第一次访问服务器时创建Session,同时也会创建一个名为beegosessionID,值为创建的Session的id的Cookie。
这个beegosessionID对应服务器中的一个Session对象,通过它就可以获取到保存用户信息的Session。
Session 是服务器创建的,也是保存在服务器上。
开启Session
Beego默认关闭Session,如果想要使用Session,有两种方法:
1.在main 入口函数中添加代码
beego.BConfig.WebConfig.Session.SessionOn = true
2. 在app.conf配置文件开启
sessionon=true
设置Session
package controllers
import "github.com/astaxie/beego"
type SessionController struct {
beego.Controller
}
func (this *SessionController) Get() {
if this.GetSession("user") == nil {
this.SetSession("user", "admin")
this.Ctx.WriteString("Session设置成功!")
}else {
//获取session
username := this.GetSession("user")
fmt.Println("sessionid = ", this.CruSession.SessionID())
this.Ctx.WriteString("user = " + username.(string))
}
}
注册路由
beego.Router("/session" ,&controllers.SessionController{})
运行之后,我们通过浏览器可以查看到,创建了beegosessionID的Cookie
GetSession返回值和GetCookie不一样,GetCookie返回的是空字符串,GetSession返回的是nil
设置Session的方法和设置Cookie的方法一样
Session相比与Cookie 它可以存储中文数据
可以使用 this.CruSession.SessionID()获取当前的SessionID
设置返回客户端的cookie名称
现在我们已经知道Session返回给客户端Cookie的名称都是 beegosessionID ,那么我们可不可以改变它呢?跟开启Seesion一样有两种方法改变:
1.在main 入口函数中添加代码
beego.BConfig.WebConfig.Session.SessionName = "my_session"
2. 在app.conf配置文件设置
#设置Session名字
sessionname=my_session
设置Session存活时间
Beego中的Session在当前会话默认存活3600秒,可以在主函数中或配置文件中设置Session的存活时间。
beego.BConfig.WebConfig.Session.SessionGCMaxLifetime =1000
设置返回客户端的Cookie的存活时间
我们可以在main 入口函数中添加代码来设置存活时间
beego.BConfig.WebConfig.Session.SessionCookieLifeTime =1000
删除Session
相比与Cookie,Session拥有两种删除函数:
1.删除指定的Session
this.DelSession("user")
2. 删除所有Session
this.DestroySession()
演示代码:
func (this *SessionController) GetDelSession() {
//DelSession和DestroySession的区别
this.SetSession("username", "admin")
this.SetSession("password", "123")
//根据传递的session名称删除指定session
//this.DelSession("username")
//删除所有session
this.DestroySession()
username := this.GetSession("username")
password := this.GetSession("password")
if username != nil {
fmt.Println("username = ", username)
}
if password != nil {
fmt.Println("password = ", password)
}
this.Ctx.WriteString("删除完毕")
}
————————————————