Spring Session的使用

Spring Session的使用

在集群部署时Session共享是一个问题,但是不用担心Spring Session提供了集中管理Session的方案

集成Spring Session到Spring Boot 应用(JDBC)

加入以下依赖

    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </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;

设置session超时时间

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中的配置

在不使用Spring session时Session的创建过程

  • 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。

在使用Spring session时Session的创建过程

  • 首先Spring Session配置会在容器中注入一个Filter(SessionRepositoryFilter)该Filter的主要任务就是将request和response包装成SessionRepositoryRequestWrapper和SessionRepositoryResponseWrapper
  • 下面的事情就变的简单多了由于request和response被包装了一层所以在SpringMvc业务逻辑层调用request和response相关方法时实际上调用的是包装类的方法,这样我们就可以在包装类上控制哪些操作我们自己来做哪些操作高request(Tomcat容器中的request)来做。
  • 然后包装类实现了自己的getSession(booleanallowCreate)方法,这样我们就可以把session信息存储到任何我们想存的介质上(当然有些Spring默认是不支持的需要自己实现)
  • 具体到几个主要的接口有,SessionRepositorySession
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值