SpringBoot + HttpSession 自定义生成sessionId
SpringBoot + HttpSession 自定义生成sessionId
在SpringBoot项目中,如何自定义生成sessionId?本文将从一个具体的业务场景出发,详细介绍通过继承StandardManager类来创建自定义的CustomStandardManager类,并通过上下文对管理器赋值来替换原有的执行方法。同时,文章还列举了几种常见的sessionId生成方式,为开发者提供新的思路和解决方案。
业务场景
最近在做用户登录过程中,由于默认ID是通过UUID创建的,缺乏足够的安全性,决定要自定义生成sessionId。
实现方案
正常的获取session方法如下:
HttpSession session = request.getSession(true);
通过DEBUG找到创建sessionId的执行方法如下(所在的类名ManagerBase):
generateSessionId方法的具体实现,底层的生成sessionId逻辑暂时先不看。
于是就有一个想法,是不是可以继承这个类,再重写获取sessionId的方法,最后把实现类注入到容器中,就可以实现。说干就干,新写一个类继承ManagerBase抽象类,但是需要我重写load和unload方法,我本意是只重写获取sessionId方法的,不想搞这么麻烦,还要再换一个方案。
随后注意到ManagerBase已存在的子类StandardManager实现了这两个方法,那么问题来了,是否可以直接继承StandardManager类呢?答案是可以的。
于是就有了,下面的自定义子类:
关键的来了,要怎么把CustomStandardManager管理类替换掉原来的执行方法呢?还是要研究源码,看下面这段代码:管理器是从上下文中获取,那么可以尝试通过上下文对管理器赋值,找了好久终于找到了赋值的方法,如下:
sessionId的生成方式
服务器端生成sessionid的方式有许多种。下面是其中一种常见的方式:
- 随机生成:服务器端可以使用随机数生成算法来生成一个唯一的sessionid。这种方法使用的是服务器的随机数生成器,并且通常会结合当前时间戳等其他因素,以增加sessionid的安全性和唯一性。
- 哈希计算:服务器端可以使用一个哈希函数对一些唯一的信息进行计算,以生成一个sessionid。这些唯一信息可以包括用户的IP地址、浏览器类型、操作系统等等。
- 使用UUID:UUID(Universally Unique Identifier)是一种标识符,具有全球唯一的特性。服务器可以使用UUID库来生成一个唯一的sessionid。
- 使用加密算法:服务器端可以使用加密算法对一些唯一信息进行加密,以生成一个唯一的sessionid。这些唯一信息可以包括用户的IP地址、浏览器类型、操作系统等等。常见的加密算法包括MD5、SHA-1、SHA-2等。
- 自定义生成:服务器端也可以根据自己的需求和特定的业务逻辑,设计一种特定的算法来生成sessionid。这种方法通常结合了一些特定的标识符、唯一信息和加密算法等。
需要注意的是,生成sessionid时要确保生成的sessionid具有足够的安全性和唯一性,以防止被恶意攻击者伪造或篡改。此外,服务器端还要考虑sessionid的存储和管理方式,以便能够有效地识别和验证sessionid的有效性。
本文原文来自CSDN