在集群部署时Session共享是一个问题,但是不用担心Spring Session提供了集中管理Session的方案
加入以下依赖
<dependency>
<groupId>org.springframework.sessiongroupId>
<artifactId>spring-session-jdbcartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jdbcartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<scope>runtimescope>
dependency>
配置文件中加入以下内容
spring:
session:
#配置session的保存方式
store-type: jdbc
datasource:
url: jdbc:mysql://localhost:3306/hl7?useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC
username: root
password: adminadmin
在数据库中创建对应的表结构,建表语句在spring-session-jdbc-.RELEASE.jar/org.springframework/session/jdbc/schema-mysql.sql
CREATE TABLE SPRING_SESSION (
PRIMARY_ID CHAR(36) NOT NULL,
SESSION_ID CHAR(36) NOT NULL,
CREATION_TIME BIGINT NOT NULL,
LAST_ACCESS_TIME BIGINT NOT NULL,
MAX_INACTIVE_INTERVAL INT NOT NULL,
EXPIRY_TIME BIGINT NOT NULL,
PRINCIPAL_NAME VARCHAR(100),
CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID)
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
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 VARCHAR(200) 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
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
1、在未使用Spring session时直接配置以下内容时就可以实现对session的控制
server:
servlet:
session:
#默认单位是s(这里注意配置的虽然是秒但是生效的是以整分钟比如配置 100实际生效的为60)
#这里推荐使用PT1M 这种方式进行配置这个表示1分钟 P固定 M-分钟 H-小时 D-天 T为日志和时间的间隔
timeout: 120
注意: 这里的逻辑可以在TomcatServletWebServerFactory.getSessionTimeoutInMinutes 找到。
2、如果使用Spring Session除了使用上面的方法设置session时还可以通过以下方法配置(此时使用上面的方法设置session过期时间时并不会损失精度)
spring:
session:
store-type: jdbc
timeout: PT3M
**注意:**这里配置的并不会损失精度,如果两个地方都配置的话这里的配置会覆盖1中的配置
Session是当使用时创建的
Spring提供了一个接口RequestAttributes 通过这个接口和Tomcat的Request请求进行交互
实现RequestAttributes的类都会持有javax.servlet.http.HttpServletRequest 通过该类的 getSession(boolean allowCreate) 方法来创建Session,持有javax.servlet.http.HttpServletResponse并在cookies中以SESSIONID为key写入sessionId
结论 所以可以得出结论,在不使用Spring session时Session的创建是通过javax.servlet.http.HttpServletRequest 的实现类(org.apache.catalina.connector.RequestFacade)来实现的Spring只是做了一次代理,也就是通过Tomcat等容器来管理Session。