package
0.0.0-20211208162728-2c17daf04a11
Repository: https://github.com/herb-go/deprecated.git
Documentation: pkg.go.dev

# Packages

No description provided by the author

# README

Session 会话组件

用于网页会话数据储存的组件

功能

  • 提供基于缓存或者客户端储存(cookie)机制的缓存驱动
  • 提供访问刷新会话生命周期的功能
  • 提供Cooke以及Header方式传递会话Token的功能
  • 提供符合 github.com/herb/user 接口的登录功能
  • 便于序列化的配置方式

配置说明

#TOML版本,其他版本可以根据对应格式配置

#基本设置
#驱动名,可选值如下
#DriverName="cookie"  基于的客户端会话
#DriverName="cache"  基于的缓存的服务器端会话
DriverName="cache"
#缓存内部使用的序列化器。默认值为msgpack,需要先行引入
Marshaler="msgpack"
#当使用自动模式安装中间件时使用的模式
#"header"使用header模式
#"cookie"或其他值使用cookie模式
Mode="cookie"
#Token设置
#基于小时的会话令牌有效时间
TokenLifetimeInHour=0
#基于天的会话令牌有效时间
#当基于小时的挥发令牌有效事件非0时,本选项无效
TokenLifetimeInDay =7
#基于天的令牌最大有效时间
#当UpdateActiveIntervalInSecond值大于0时,令牌在访问后会更新有效时间
#这个值决定了有效事件的最大值
TokenMaxLifetimeInDay=24
#访问时更新token的间隔。默认值为60
UpdateActiveIntervalInSecond=60
#会话令牌在HTTP请求上下文中的名字。当同时使用多套上下文时需要指定不同的名字。默认值为"token"
TokenContextName="token"
#是否自动生成会话,默认值为false
AutoGenerate=false


#Cooke设置
#储存session的cookie名,默认值为"herb-session"
CookieName="herb-session"
#Cookie的路径设置,默认值为"/"
CookiePath="/"
#Cookie的Secure,默认值为false
CookieSecure=false

#其他设置
#默认会话的标志位信息.默认值为1
DefaultSessionFlag=1


#客户端会话设置
#客户端会话密钥
ClientStoreKey="key"

#缓存会话设置
#会话令牌前缀模式。可用值为
#"empty":空
#"raw":原始值
#"md5":md5后的摘要值
#默认值为raw
TokenPrefixMode=""
#令牌数据长度。
#注意数据长度是原始数据长度。存入cookie时的长度还要经过base64转换
#默认值为64
TokenLength=64
#缓存驱动
"Cache.Driver"="syncmapcache"
#缓存有限时间
"Cache.TTL"=1800
#具体缓存配置
"Cache.Config.Size"=5000000

使用方法

创建会话,进行配置

store:=session.New()
config:=&session.StoreConfig{}
err=toml.Unmarshal(data,&config)
err=config.ApplyTo(store)

安装会话中间件

安装会话中间件的方式包括cookie模式,header模式,自动模式

1.cookie模式安装,自动通过配置中CookieName的cookie值作为session的token

app.Use(store.CookieMiddleware)

2.header模式安装,通过指定的请求头的值做为session token。

客户端需要自行维护token

app.Use(store.HeaderMiddleware("headername"))

3.自动模式安装。

通过配置文件中的Mode值决定使用cookie模式还是session模式安装

如果Mode值为header,使用配置中的CookieName为请求头作为session token值,由客户端自行维护token

其他情况下同cookie模式安装

app.Use(store.InstallMiddleware())

4.使用注销中间件

将对应请的session清除,一般用于注销

app.Use(store.DestoryMiddleware()).HandleFunc(logoutaction)

在动作中设置与获取Session值

使用Store.Get,Store.Set和Store.Del维护session

注意,正常情况下session值会在程序正常运行,返回至会话中间件时才进行更新和cookie变更。之间如果程序panic的话,之前的设置会失效

func(w http.ResponseWriter, r *http.Request) {
	err=store.Set(r,"sessionfieldname","new value")
	var v string
	//Get时需要传入指针
	err=store.Get(r,"sessionfieldname",&v)
	err=store.Del(r,"sessionfieldname")
}

Session对象

Session是一个存放了所有会话数据的可序列化的结构。

获取Session

获取和维护Session主要有两个方向

1.通过Session Store从http请求中获取

//获取session
s,err:=store.GetRequestSession(r)

//将请求中的Session进行保存
err=s.SaveRequestSession(r)

2.通过Session Store直接创建/维护Session

s:=session.NewSession(store,"token")

使用Session对象

err=s.Set("sessionfieldname","value)
var v string
err=s.Get("sessionfieldname",&v)
err=s.Del("sessionfieldname")
//获取session的token值

注意,session值的修改需要保存后才能存入store

维护Session对象

 //重置session除token外的所有数据
 s.Regenerate()
 //从Store中通过token加载Session
 err=s.Load()
 //保存Session
 err=s.Save()
 //删除SEssion
 err=s.DeleteAndSave()

Sesssion的token操作

//获取token
token,err:=s.Token()
token=s.MustToken()
//设置token
s.SetToken(token)
//重新生成token,需要设置Prefix,比如用户Id
err=s.RegenerateToken("prefix)

Field对象

Field对象是指指定字段名的session字段。

他的用途主要有两个,一个是为使用session的程序提供一个储存特定数据的接口,另一个是可以直接用来的进行用户的登录和登出

//创建field
field:=store.Field("fieldname)
//使用field数据
err=field.Set("value")
var v string
err=field.Get(&v)
//删除数据
err=field.Flush()

//实现用户接口
uid,err:=field.IdentifyRequest(r)
//实现用户登录接口
err=field.Login(w,r,"userid)
//实现用户登出接口
err=field.Logout(w,r)