iteny / sessions-1

使用golang实现的session功能,存储引擎使用redis

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Sessions

使用golang实现的Sessions功能包,仅支持Redis存储,Redis的驱动包使用的是go-redis/redis,已实现以下功能:

  • 写入指定键名的值
  • 根据键名读取值并转换类型
  • 根据键名删除值
  • 清除所有Session数据但保留Cookie中的SessionID
  • 清除所有Session数据以及Cookie中的SessionID,下次请求时重新生成新的SessionID

使用示例

此示例的HTTP框架使用的是HTTP Dispatcher,也可以和更多框架整合

package main

import (
	"log"
	"net/http"
	"time"

	"github.com/dxvgef/httpdispatcher"
	"github.com/dxvgef/sessions"
)

//定义session管理器
var sessManager *sessions.SessionManager

func main() {
	log.SetFlags(log.Lshortfile)

	//设置session管理器
	err := setSessManager()
	if err != nil {
		log.Fatalln(err.Error())
	}

	//定义一个http调度器
	dispatcher := httpdispatcher.New()
	//启用500错误
	dispatcher.EventConfig.ServerError = true
	//定义事件处理器
	dispatcher.Handler.Event = func(e *httpdispatcher.Event) {
		log.Println(e.Source)
		log.Println(e.Message)
	}

	//定义一个路由处理器用于写入session
	dispatcher.Router.GET("/", func(ctx *httpdispatcher.Context) error {
		//启用session
		session, err := sessManager.UseSession(ctx.Request, ctx.ResponseWriter)
		if err != nil {
			log.Println(err.Error())
			return err
		}
		//写入值
		err = session.Set("test", "ok")
		return err
	})

	//定义一个路由处理器用于演示sessions的其它操作
	dispatcher.Router.GET("/test", func(ctx *httpdispatcher.Context) error {
		//启用session
		session, err := sessManager.UseSession(ctx.Request, ctx.ResponseWriter)
		if err != nil {
			log.Println(err.Error())
			return err
		}
		//读取string类型的值
		var value string
		value, err = session.Get("test").String()
		if err != nil {
			log.Println(err.Error())
			return err
		}
		ctx.ResponseWriter.WriteHeader(200)
		ctx.ResponseWriter.Write([]byte(value))

		//删除指定key的数据
		err = session.Delete("test")
		if err != nil {
			log.Println(err.Error())
			return err
		}
		//清除session数据但不删除cookie中的sessionID
		err = session.ClearData()
		if err != nil {
			log.Println(err.Error())
			return err
		}
		//清除session数据以及cookie中的sessionID
		//下次请求时会重新生成新的sessionID
		err = sessManager.ClearAll(ctx.Request, ctx.ResponseWriter)
		if err != nil {
			log.Println(err.Error())
			return err
		}
		return nil
	})

	//启动HTTP服务
	if err := http.ListenAndServe(":8080", dispatcher); err != nil {
		log.Fatal(err.Error())
	}
}

//设置sessionManager
func setSessManager() error {
	var err error
	//创建session管理器
	sessManager, err = sessions.NewSessions(&sessions.Config{
		CookieName:     "sessionid",        //cookie中的sessionID名称
		HttpOnly:       true,               //仅允许HTTP读取,js无法读取
		Path:           "/",                //作用路径
		MaxAge:         60 * 60,            //最大生命周期(秒)
		IdleTime:       20 * time.Minute,   //空闲超时时间
		Secure:         false,              //启用HTTPS
		RedisAddr:      "127.0.0.1:32771",  //Redis地址
		RedisDB:        0,                  //Redis数据库
		RedisPassword:  "",                 //Redis密码
		RedisKeyPrefix: "sess",             //Redis中的键名前缀,必须
		Key:            "abcdefghijklmnop", //用于加密sessionID的密钥,密钥的长度16,24,32对应AES-128,AES-192,AES-256算法
	})
	if err != nil {
		return err
	}
	return nil
}

About

使用golang实现的session功能,存储引擎使用redis


Languages

Language:Go 100.0%