• 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
  • 相关阅读:
    python排序
    JavaMail转发邮件
    Java发送邮件Demo
    字符编码
    常用的python内建函数
    mysql-python安装
    ubuntu安装flash
    grep简介
    【java中的static关键字】
    【java中的final关键字】
  • 原文地址:https://www.cnblogs.com/wuyongyin/p/11775849.html
Copyright © 2020-2023  润新知