`
qq466862016
  • 浏览: 128208 次
  • 来自: 杭州
社区版块
存档分类
最新评论

使用go 对session的支持

阅读更多

使用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

 

1
5
分享到:
评论

相关推荐

    Go-Packagesession为Macaron提供session管理

    在Go中,session管理通常依赖于第三方库,如`go-sessions`,它是专门为Go语言设计的一个高效且灵活的session管理库,可以很好地与Macaron框架集成。 首先,我们需要安装`go-sessions`库。通过运行以下命令,你可以...

    tomcat8+redis集群 session共享jar

    本示例中,我们使用了`tomcat8-redis-session-manager-2.0.0.jar`这个库,它是专门为Tomcat设计的,实现了将session数据持久化到Redis集群的能力。这个库依赖于两个其他的库:`commons-pool2-2.4.2.jar`和`jedis-...

    实现京东抢茅台脚本源码go语言

    这通常涉及到模拟点击事件,可能需要使用到`jsdom`等库来解析和操作JavaScript,但这在Go语言中并不直接支持,你可能需要借助Node.js或其他能解析JavaScript的语言。一种解决方案是使用Selenium WebDriver,这是一个...

    基于Go实现的Session组件.zip

    并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理...

    Go-GosessionGo编程语言最快的Websession管理器

    总结,Go-Gosession是Go语言中用于Web session管理的一个强大工具,它提供了高性能、兼容性和灵活性,使得开发者能够轻松地在不同的Web框架下实现用户会话管理。正确理解和使用session管理对于构建健壮的Web应用至关...

    go语言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框架 Cookie和Session 操作手册 (十)

    在Go语言中,Gin框架是一个非常流行的用于构建Web服务的库,它提供了简洁的API设计,使得开发者能够快速地开发出高性能的应用程序。本文将深入探讨如何在Gin框架中处理Cookie和Session,这对于构建用户认证和会话...

    一款集漏洞探测、攻击,Session会话,蜜罐识别等功能于一身的软件,基于go-micro微服务框架

    并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理...

    Go-Go标准库所有使用方法例子请注意这不是Go的中文版标准库

    "Go-Go标准库所有使用方法例子" 提供了Go语言标准库的详细使用示例,这是一份非常有价值的参考资料,旨在帮助开发者更好地理解和运用Go语言的标准库功能。虽然标题提示这不是Go的中文版标准库,但其内容对于中文环境...

    Go-gorethink-RethinkDB的Go语言驱动器

    gorethink是RethinkDB官方支持的Go语言客户端驱动,它为Go程序员提供了便捷的接口来操作RethinkDB。通过这个驱动,开发者可以利用Go的简洁语法执行RQL(RethinkDB查询语言)查询,进行数据的增删改查操作,并实现...

    login for cookie or session or token

    在Golang中,可以使用`dgrijalva/jwt-go`库来处理JWT的生成、验证和解析。JWT的优点在于它们不需要在服务器之间共享状态,减少了服务器负载。 在选择登录认证方法时,需要考虑以下因素: - **安全性**:Cookie可能...

    golang环境配置及对接s3对象存储demo手册及源代码

    - **golang-demo使用手册.docx**:这个文档很可能是详细指导如何使用`golang-demo.go`源代码的指南,包括配置步骤、调用API的示例以及可能出现的问题和解决方案。建议仔细阅读,以便更好地理解和应用代码。 - **...

    Go Web 编程中文版2015.7月版

    Go语言是一种新兴的编程语言,具有并发支持、垃圾回收机制、快速编译等特点...书中强调了Go语言的并发特性、快速编译、简单依赖管理和对网络编程的支持,旨在帮助开发者们快速掌握Go语言,并在Web开发领域中高效工作。

    mongoDB mgo GO语言驱动

    mgo是为Go语言(也称为Golang)设计的一个MongoDB驱动程序,允许Go开发者充分利用MongoDB的功能。 Go语言是一种由Google开发的静态类型编程语言,强调简洁、高效的语法和并发编程能力。mgo库是Go社区中广泛使用的...

    Go-基于golang语言开发一个个人博客项目

    在本项目中,我们将深入探讨如何使用Golang(Go语言)来开发一个个人博客系统。Golang作为一种现代、高效且简洁的编程语言,因其强大的并发处理能力、内存管理以及易于学习的特点,近年来在Web开发领域得到了广泛...

    Go语言web框架Seago.zip

    Seago是golang实现的简单的web框架,router包来自web.go和martini 功能 支持RESTful 支持Session 支持Cache 支持Middleware 标签:Seago Web框架

    Golang在京东的使用.pptx

    Go语言,简称Golang,因其高效、简洁的特性,被京东等大型企业广泛应用于多个核心项目。本文将深入探讨Golang在京东内部的具体应用,包括京东云消息推送系统和云存储服务,以及在开发过程中遇到的挑战和解决方案。 ...

    Go语言开发资料(LiteIDE+基础入门+Web)

    最后,《build-web-application-with-golang-zh.pdf》是一本关于使用Go语言开发Web应用的实战指南。书中会介绍如何使用Go的标准库"net/http"来创建服务器,处理HTTP请求和响应,以及如何组织MVC(Model-View-...

Global site tag (gtag.js) - Google Analytics