如何用Go实现Session会话管理器


本文小编为大家详细介绍“如何用Go实现Session会话管理器”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何用Go实现Session会话管理器”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。首先必须了解工作原理才能写代码,这里我就稍微说一下,session是基于cookie实现的,一个session对应一个uuid也是sessionid,在服务器创建一个相关的数据结构,然后把这个sessionid通过cookie让浏览器保存着,下次浏览器请求过来了就会有sessionid,然后通过sessionid获取这个会话的数据。依赖关系上面是设计的相关依赖关系图,session是一个独立的结构体,GlobalManager是整体的会话管理器负责数据持久化,过期会话垃圾回收工作♻️,storage是存储器接口,因为我们要实现两种方式存储会话数据或者以后要增加其他持久化存储,所以必须需要接口抽象支持,memoryredis是存储的具体实现。storage接口storage就9行代码,是具体的会话数据操作动作的抽象,全部参数使用的是session这个结构的指针,如果处理异常了就即错即返回。为什么把函数签名的形参使用指针类型的,这个我想看的懂人应该知道这是为什么了????memoryStore结构体memoryStore结构体里面就嵌入sync.Map结构体,一开始是使用的map这种,但是后面发现在并发读写然后加sync.Mutex锁????,性能还不如直接使用sync.Map速度快。sync.Map用来做K:V存储的,也就是sessionid对应session data的。实现storage具体方法免费云主机域名如下:读取数据的时候先将持久化的数据读出来然后赋值给本次会话的session注意: 在go的map中的struct中的字段不能够直接寻址其他几个函数:这句话代码没有什么好说的,写过go都能看得懂。垃圾回收:比较会话过期时间,过期就删除会话,以上就是内存存储的实现。redisStore结构体代码也就50行左右,很简单就是通过redis客户端对数据进行持久化操作,把本地的会话数据提供encoding/gob序列化成二进制写到redis服务器上存储,需要的时候再反序列化出来。那么问题来了,会有人问了,redis没有并发问题吗?????‍????‍: 那我肯定会回答,你在问这个问题之前我不知道你有没有了解过redis???Redis 并发竞争指的是多个 Redis 客户端同时 set key引起的并发问题,Redis 是一种单线程机制的 NoSQL 数据库,所以 Redis 本身并没有锁的概念。但是多客户端同时并发写同一个 key,一个 key 的值是 1,本来按顺序修改为 2,3,4 ,最后 key 值是 4,但是因为并发去写 key,顺序可能就变成了 4,3,2,最后 key 值就变成了 2。我这个库当前也就一个客户端,如果你部署到多个机子,那就使用 setnx(key, value) 来实现分布式锁,我当前写的这个库没有提供分布式锁,具体请自行googlemanager结构体manager结构体也就两个字段,一个存放我们全局配置信息,一个我们实例化不同的持久化存储的存储器,其他代码就是辅助性的代码,不细说了。Session结构体这个结构体是对应着浏览器会话的结构体,设计原则是一个id对应一个session结构体。具体操作函数:上面是几个函数是,会话的数据操作函数,refreshCookie()是用来刷新浏览器cookie信息的,因为我在设计的时候只有浏览器有心跳也就是有操作数据的时候,管理器就默认为这个浏览器会话还是活着的,会自动同步更新cookie过期时间,这个更新过程可不是光刷新cookie就完事的了,持久化的话的数据过期时间也一样更新了。Handler方法Handler函数是从http请求里面读取到sessionid然后从持久化层读取数据然后实例化一个session结构体的函数,没有啥好说的,注释写上面了。首先我还是那句话:不懂攻击,怎么做防守
那我们先说说这个问题怎么产生的:中间人攻击Man-in-the-MiddleAttack,简称MITM攻击)是一种间接的入侵攻击,这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机就称为中间人。这个过程,正常用户在通过浏览器访问我们编写的网站,但是这个时候有个hack通过arp欺骗,把路由器的流量劫持到他的电脑上,然后黑客通过一些特殊的软件抓包你的网络请求流量信息,在这个过程中如果你sessionid如果存放在cookie中,很有可能被黑客提取处理,如果你这个时候登录了网站,这是黑客就拿到你的登录凭证,然后在登录进行重放也就是使用你的sessionid,从而达到访问你账户相关的数据目的。如果大家写过Java语言,都应该使用过springboot这个框架,如果你看过源代码,那就知道这个框架里面的session安全策略有一个migrateSession选项,表示在登录成功之后,创建一个新的会话,然后讲旧的 session 中的信息复制到新的 session 中。我参照他的策略,也同样在我这个库里面实现了,在用户匿名访问的时候是一个 sessionid,当用户成功登录之后,又是另外一个 sessionid,这样就可以有效避免会话固定攻击。使用的时候也可以随时使用通过MigrateSession进行调用,这个函数一但被调用,原始数据和id全部被刷新了,内存地址也换了,可以看我的源代码。读到这里,这篇“如何用Go实现Session会话管理器”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注百云主机行业资讯频道。

相关推荐: C#位运算符的基本使用方法有哪些

本文小编为大家详细介绍“C#位运算符的基本使用方法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#位运算符的基本使用方法有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。位运算符包括:| 按位或 OR,& 按位与…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 02/19 19:47
下一篇 02/19 19:48

相关推荐