使用go 对session的支持
Skip to content This repository Search Pull requests Issues Gist @dongtian3240 Unwatch 1 Star 0 Fork 0 dongtian3240/gosession Code Issues 0 Pull requests 0 Wiki Pulse Graphs Settings Branch: master Find file Copy pathgosession/gosession.go f79751f 5 days ago dongtian3240 提交session验证有效期问题 0 contributors RawBlameHistory 194 lines (150 sloc) 3.87 KB package gosession import ( "crypto/rand" "encoding/base64" "fmt" "net/http" "sync" "time" ) var ( Domain string = "localhost" Path string = "/" HttpOnly bool = false MaxAge int = 3600 GoSessionId string = "gosession-id" ) type SyncGoSession interface { UpdateSession(response http.ResponseWriter, request *http.Request) } type GoSession struct { SId string data map[string]interface{} } type GoSessionManager struct { gosessions map[string]*GoSession CreateAts map[string]time.Time GCInterval time.Duration GoSessionId string MaxAge int Domain string HttpOnly bool Path string sync.Mutex } func NewGoSessionManager(gosessionsId string, gcInterval time.Duration) *GoSessionManager { if gosessionsId == "" { gosessionsId = GoSessionId } if gcInterval <= 0 { gcInterval = time.Millisecond * 100 } return &GoSessionManager{ gosessions: make(map[string]*GoSession), CreateAts: make(map[string]time.Time), MaxAge: MaxAge, Domain: Domain, HttpOnly: HttpOnly, Path: Path, GoSessionId: gosessionsId, GCInterval: gcInterval, } } //获取gosession func (gsm *GoSessionManager) GetGoSession(response http.ResponseWriter, request *http.Request) *GoSession { currentCookie, err := request.Cookie(gsm.GoSessionId) //创建一个新的gosession if err != nil || currentCookie == nil { return gsm.createGoSession(response, request) } else { //当前gosession是否存在 goSession, has := gsm.hasGoSession(currentCookie.Value) if has { // 如果存在将直接返回 return goSession } else { return gsm.createGoSession(response, request) } } } // 查询是否已经存在 func (gsm *GoSessionManager) hasGoSession(key string) (*GoSession, bool) { goSesion, ok := gsm.gosessions[key] return goSesion, ok } //创建一个新的gosession func (gsm *GoSessionManager) createGoSession(response http.ResponseWriter, request *http.Request) *GoSession { var bys = make([]byte, 32) rand.Read(bys) cValue := base64.StdEncoding.EncodeToString(bys) c := &http.Cookie{ Name: gsm.GoSessionId, Value: cValue, Path: gsm.Path, Domain: gsm.Domain, MaxAge: gsm.MaxAge, HttpOnly: gsm.HttpOnly, } http.SetCookie(response, c) goSession := &GoSession{ SId: cValue, data: make(map[string]interface{}), } gsm.gosessions[cValue] = goSession gsm.CreateAts[cValue] = time.Now().Add(time.Second * time.Duration(gsm.MaxAge)) return goSession } func (gs *GoSession) Get(key string) interface{} { va, ok := gs.data[key] if ok { return va } else { return nil } } func (gs *GoSession) Set(key string, va interface{}) { gs.data[key] = va } func (gs *GoSession) Delete(key string) { delete(gs.data, key) } //垃圾收集处理过期的 GoSession func StartGC(gsm *GoSessionManager) { go func() { for _ = range time.Tick(gsm.GCInterval) { fmt.Println("************ GC **************") for k, v := range gsm.CreateAts { if gsm.expiredSession(v) == false { gsm.Delete(k) } } } }() } //判断是否过期 func (gsm *GoSessionManager) expiredSession(at time.Time) bool { return time.Now().Before(at) } //根据key删除gosession func (gsm *GoSessionManager) Delete(key string) { gsm.Lock() defer gsm.Unlock() delete(gsm.CreateAts, key) delete(gsm.gosessions, key) } // 更新gosession func (gsm *GoSessionManager) UpdateGoSession(response http.ResponseWriter, request *http.Request) { currentCookie, err := request.Cookie(gsm.GoSessionId) var key string if err != nil || currentCookie == nil { return } key = currentCookie.Value _, ok := gsm.CreateAts[key] if ok { fmt.Println("=======update goSession ===========") gsm.CreateAts[key] = time.Now().Add(time.Second * time.Duration(gsm.MaxAge)) fmt.Println("at ", gsm.CreateAts[key], "key=", key) currentCookie.MaxAge = gsm.MaxAge http.SetCookie(response, currentCookie) } } Status API Training Shop Blog About © 2016 GitHub, Inc. Terms Privacy Security Contact Help
传送门 https://github.com/dongtian3240/gosession
相关推荐
在Go中,session管理通常依赖于第三方库,如`go-sessions`,它是专门为Go语言设计的一个高效且灵活的session管理库,可以很好地与Macaron框架集成。 首先,我们需要安装`go-sessions`库。通过运行以下命令,你可以...
本示例中,我们使用了`tomcat8-redis-session-manager-2.0.0.jar`这个库,它是专门为Tomcat设计的,实现了将session数据持久化到Redis集群的能力。这个库依赖于两个其他的库:`commons-pool2-2.4.2.jar`和`jedis-...
这通常涉及到模拟点击事件,可能需要使用到`jsdom`等库来解析和操作JavaScript,但这在Go语言中并不直接支持,你可能需要借助Node.js或其他能解析JavaScript的语言。一种解决方案是使用Selenium WebDriver,这是一个...
并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理...
总结,Go-Gosession是Go语言中用于Web session管理的一个强大工具,它提供了高性能、兼容性和灵活性,使得开发者能够轻松地在不同的Web框架下实现用户会话管理。正确理解和使用session管理对于构建健壮的Web应用至关...
2.Go语言基础 2.1. 你好,Go 2.2. Go基础 2.3. 流程和函数 2.4. struct 2.5. 面向对象 2.6. interface 2.7. 并发 2.8. 小结 3.Web基础 3.1 web工作方式 3.2 Go搭建一个简单的web服务 3.3 Go如何使得web工作 3.4 Go的...
在Go语言中,Gin框架是一个非常流行的用于构建Web服务的库,它提供了简洁的API设计,使得开发者能够快速地开发出高性能的应用程序。本文将深入探讨如何在Gin框架中处理Cookie和Session,这对于构建用户认证和会话...
并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理...
"Go-Go标准库所有使用方法例子" 提供了Go语言标准库的详细使用示例,这是一份非常有价值的参考资料,旨在帮助开发者更好地理解和运用Go语言的标准库功能。虽然标题提示这不是Go的中文版标准库,但其内容对于中文环境...
gorethink是RethinkDB官方支持的Go语言客户端驱动,它为Go程序员提供了便捷的接口来操作RethinkDB。通过这个驱动,开发者可以利用Go的简洁语法执行RQL(RethinkDB查询语言)查询,进行数据的增删改查操作,并实现...
在Golang中,可以使用`dgrijalva/jwt-go`库来处理JWT的生成、验证和解析。JWT的优点在于它们不需要在服务器之间共享状态,减少了服务器负载。 在选择登录认证方法时,需要考虑以下因素: - **安全性**:Cookie可能...
- **golang-demo使用手册.docx**:这个文档很可能是详细指导如何使用`golang-demo.go`源代码的指南,包括配置步骤、调用API的示例以及可能出现的问题和解决方案。建议仔细阅读,以便更好地理解和应用代码。 - **...
Go语言是一种新兴的编程语言,具有并发支持、垃圾回收机制、快速编译等特点...书中强调了Go语言的并发特性、快速编译、简单依赖管理和对网络编程的支持,旨在帮助开发者们快速掌握Go语言,并在Web开发领域中高效工作。
mgo是为Go语言(也称为Golang)设计的一个MongoDB驱动程序,允许Go开发者充分利用MongoDB的功能。 Go语言是一种由Google开发的静态类型编程语言,强调简洁、高效的语法和并发编程能力。mgo库是Go社区中广泛使用的...
在本项目中,我们将深入探讨如何使用Golang(Go语言)来开发一个个人博客系统。Golang作为一种现代、高效且简洁的编程语言,因其强大的并发处理能力、内存管理以及易于学习的特点,近年来在Web开发领域得到了广泛...
Seago是golang实现的简单的web框架,router包来自web.go和martini 功能 支持RESTful 支持Session 支持Cache 支持Middleware 标签:Seago Web框架
Go语言,简称Golang,因其高效、简洁的特性,被京东等大型企业广泛应用于多个核心项目。本文将深入探讨Golang在京东内部的具体应用,包括京东云消息推送系统和云存储服务,以及在开发过程中遇到的挑战和解决方案。 ...
最后,《build-web-application-with-golang-zh.pdf》是一本关于使用Go语言开发Web应用的实战指南。书中会介绍如何使用Go的标准库"net/http"来创建服务器,处理HTTP请求和响应,以及如何组织MVC(Model-View-...