Spring Boot整合Spring Session實戰


傳統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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM