传统java web应用session都是由应用服务器(如tomcat)保存在内存中,这对应但节点应用来说没问题;但对于应用集群来说会造成各节点之间的session无法共享,一个节点挂掉后,其他节点接管后无法获取挂掉节点的session信息,会使用户需要重新登陆,影响用户体验。Spring Session可以把集群中各节点的session集中存储,解决session共享问题。本文只要介绍Spring Session使用JDBC、Redis两种方法来保存seesion。本文中demo所使用的软件环境为:Spring Boot 2.1.4.RELEASE、jdk8。

1、JDBC方式

这里以oracle数据库为例,其他数据也可以。

1.1、引入依赖

<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-jdbc</artifactId>
</dependency>

1.2、配置存储方式

application.properties里增加:

spring.session.store-type=jdbc

1.3、配置数据源

需在application.properties配置数据源,否则连不了数据库,数据源的配置方式很多,可能还会用到其他组件,这里就不具体演示了。

spring.datasource.url=
spring.datasource.username=
spring.datasource.password=

1.4、创建session相关表

各数据库的sql脚本在classpath:org/springframework/session/jdbc目录下

CREATE TABLE SPRING_SESSION (
PRIMARY_ID CHAR(36) NOT NULL,
SESSION_ID CHAR(36) NOT NULL,
CREATION_TIME NUMBER(19,0) NOT NULL,
LAST_ACCESS_TIME NUMBER(19,0) NOT NULL,
MAX_INACTIVE_INTERVAL NUMBER(10,0) NOT NULL,
EXPIRY_TIME NUMBER(19,0) NOT NULL,
PRINCIPAL_NAME VARCHAR2(100 CHAR),
CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID)
); CREATE UNIQUE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID);
CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME);
CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME); CREATE TABLE SPRING_SESSION_ATTRIBUTES (
SESSION_PRIMARY_ID CHAR(36) NOT NULL,
ATTRIBUTE_NAME VARCHAR2(200 CHAR) NOT NULL,
ATTRIBUTE_BYTES BLOB NOT NULL,
CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME),
CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE
);

1.5、测试

启动程序后调用session.setAttribute方法后可以看到表里有数据了:

1.6、自定义表名

Spring Session默认的表名为SPRING_SESSION、SPRING_SESSION_ATTRIBUTES;可以建成自己想要的表名,如:I_SPRING_SESSION、I_SPRING_SESSION_ATTRIBUTES(注:属性表的表名时session表名后增加“_ATTRIBUTES”),然后在application.properties里增加如下配置即可:

spring.session.jdbc.table-name=I_SPRING_SESSION

2、Redis方式

2.1、引入依赖

<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</dependency>

2.2、配置存储方式

application.properties里增加:

spring.session.store-type=redis

2.3、配置redis

application.properties里增加:

spring.redis.host=10.39.196.10
spring.redis.port=6379
spring.redis.password=123456

2.4、测试

启动程序后调用session.setAttribute方法后可以看到redis里有数据了:

2.5、自定义key的前缀

Spring Session默认保存在redis里的数据前缀为spring:session,可以自定义如i:spring:session,然后在application.properties里增加如下配置即可:

spring.session.redis.namespace=i:spring:session

最新文章

  1. [bzoj1670][Usaco2006 Oct]Building the Moat
  2. .net线程池
  3. 【Alpha阶段】第一次线上会议
  4. oracle中session的查询与删除
  5. Qt OpenCV Support Image Type 支持读写的图像格式
  6. PHPnow升级PHP 5.4与Mysql 5.5
  7. Android之ActionBar学习
  8. 了解大数据的技术生态系统 Hadoop,hive,spark(转载)
  9. 用stm32f0x建立新的工程重要步骤
  10. (C++)string类杂记
  11. 小程序wepy.js框架总结
  12. JS分页条插件
  13. Codeforces round 1083
  14. python windows 安装jieba....
  15. matplotlib 雷达图2
  16. VBA 调用DLL动态链接库
  17. Spring容器初始化数据(数据库)BeanPostProcessor的应用
  18. Rabbitmq的几种交换机模式
  19. 我理解的Future模式
  20. 万里长征第二步——django个人博客(第四步 ——创建数据库)

热门文章

  1. Spring AOP Log
  2. Kotlin集合——Set集合
  3. Ionic4.x ion-refresher 下拉更新
  4. 服务器端实时推送技术之SseEmitter的用法
  5. C++11 学习笔记 std::function和bind绑定器
  6. Qt widget中使用QML自定义电池
  7. phpexcel 导出excel无法打开,提示文件格式或文件名无效,文件损毁,解决办法
  8. 使用Commons math做数值计算
  9. 深入浅出深度学习:原理剖析与python实践_黄安埠(著) pdf
  10. 条件概率和链式法则 conditional probability &amp; chain rule