spring-session+mysql的坑

spring-session+mysql简单配置

application.properties

#引入jdbc,为mysql类型的spring-session
spring.session.store-type=jdbc
#初始化数据库schema的SQL脚本目录。自动创建对应的数据表。
spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-mysql.sql
#用于存储会话的数据库表名。
spring.session.jdbc.table-name=SPRING_SESSION

pom.xml

  <!-- 引入spring-session-->
    <!-- https://mvnrepository.com/artifact/org.springframework.session/spring-session-jdbc -->
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-jdbc</artifactId>
    </dependency>

以上是整个的配置,就这么简简单单。
此处使用是默认版本,如果用最新版本,后续的很多东西需要改动,(下面有说明)

配置好一切后,spring-session就会接管session,当打开浏览器访问时候,就会自动创建token已经对应的sessionId存储起来。以下分享一篇详细文章

--------------------------------------------------------------------------------------------------------------------------------------
关键坑

今天要说的是另外一个问题,通过HttpURLConnection创建的url访问,无法使spring-session接管的session进行自动刷新存活时间,这个问题也困扰了我很久时间。

通过查找资料(百度)以及 spring-session 的 API 后。总是是对其进行了手动更新信息

spring-session自动生成默认存在mysql的token是跟sessionId一样的(也可以自行修改)

下面说说spring-session中的 SessionRepository 的几个方法

代码关键
@Resource
private SessionRepository< ExpiringSession > sessionRepository

我们可以通过SessionRepository可以访问由spring-session创建的数据表数据,并对其操作

SessionRepository中的几个方法

createSession();//创建新的session或者更新

void save(S var1);//创建新的session或者更新需要搭配createSession()方法一起使用

getSession(String var1);//得到对应的session

void delete(String var1);//删除数据库中的session根据sessionId来

以上方法不多。而我们使用起来也是简单粗暴。
在需要的对每个访问者进行校验方法里面依次使用进行查询判断即可

 //根据访问的sessionId进行数据查询并返还对应数据
  ExpiringSession expiringSession =   sessionRepository.getSession(sessionId);
 
    //判断mysql中存储的spring-session的sessionId是否为空
    if(null != expiringSession){
        //判断判断mysql中存储的spring-session中的sessionId是否有token
        if(null != expiringSession.getAttribute("token")){
           //此处还可以增加判断token进一步限制,由于我没有更改token的生成方式,
           //是默认sessionId,就省掉
           //手动更新数据库的session存活时间
           expiringSession.setLastAccessedTime(System.currentTimeMillis());
           //执行更新操作,就此数据库的session就手动更新完毕
            sessionRepository.createSession();
            sessionRepository.save(expiringSession);
            return "true";
        }
    }
    return "false";

前面有说到,为啥我用默认版本而不用最新版本。。
根据API的说明:最新版在 SessionRepository< ExpiringSession > 中 ExpirngSession是无法使用,而是用了 JdbcIndexedSessionRepository进行代替。
由于本人过于菜鸟,还没研究个明白,所以只能用默认版本中的ExpiringSession

还有关于自定义更改token的值,其实也是使用上述代码中ExpiringSession里有个setAttribute()与sessiond 设置一样,对应k,v值就可以覆盖系统自动生成的token值。
(虽然本人没有实践过,但相信就是这样做的,嗯,没错,就是这样)
以上,就是这些天研究spring-session+mysql的实现session共享,统一验证的结果了。

1 个赞