springboot 2.X jdbc 实现session共享mysql

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/82187405 POM文件 org.
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/82187405

POM文件

      <!-- 数据库session管理 -->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-jdbc</artifactId>
        </dependency>

4.3. 使用JDBC的HttpSession

在使用HttpSession的任何功能之前通过添加一个Servlet过滤器,就可以启用Spring Session,可以通过如下几种方式进行启用:

  1. 基于Java的配置
  2. 基于XML的配置
  3. 基于Spring Boot的配置

4.3.1. 基于Java配置JDBC

本节介绍基于Java配置的方式如何使用关系型数据库支持HttpSession。

HttpSession JDBC样例提供了一个可执行的样例,这个样例提供了如何基于Java配置整合Spring Session和HttpSession。你可以阅读以下的一些基础步骤,但是当您与自己的应用程序整合时,推荐遵循详细的HttpSession JDBC参考指南。

Spring Java配置

在添加完成必要的依赖之后,我们就可以创建我们自己的配置。Spring配置负责创建一个Servlet过滤器,这个过滤器通过一个使用Spring Session支持的实现去替换HttpSession。添加如下的Spring配置:

@EnableJdbcHttpSession 
public class Config {
    @Bean
    public EmbeddedDatabase dataSource() {
        return new EmbeddedDatabaseBuilder() 
                .setType(EmbeddedDatabaseType.H2)
                .addScript("org/springframework/session/jdbc/schema-h2.sql").build();
    }

    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource); 
    }
}
  1. @EnableJdbcHttpSession 注解创建了一个实现了Filter的名为springSessionRepositoryFilter的Bean。过滤器负责使用Spring Session支持的一个实现去替换HttpSession,这个实例中Spring Session由关系型数据库支持。
  2. 我们创建一个dataSource链接Spring Session和一个被嵌入的H2数据库实例。我们配置H2数据库使用包含在Spring Session中的SQL脚本创建一张数据表。
  3. 我们创建一个transactionManager去管理前面所创建的数据库的事务。

对于如何配置数据访问的一些相关概念的附加信息,请参考Spring Framework参考文档

Java Servlet容器初始化

我们的Spring配置文件已经创建了一个实现了Filter的名为springSessionRepositoryFilterBean。springSessionRepositoryFilter负责使用一个支持Spring Session的实现替换HttpSession。

为了让我们的Filter发挥它的魔力,Spring需要加载我们的Config类。最后我们需要确保每次请求Servlet容器都使用了springSessionRepositoryFilter。幸运的是,Spring Session提供了一个很有效的名为AbstractHttpSessionApplicationInitializer的类,使用这个类可以让加载Config类变得非常的容易。例子如下:

public class Initializer extends AbstractHttpSessionApplicationInitializer { 

    public Initializer() {
        super(Config.class); 
    }
}

我们自己的类(Initializer )的命名我们并不关心,最重要的是要继承AbstractHttpSessionApplicationInitializer。

  1. 第一步是需要继承AbstractHttpSessionApplicationInitializer。这样可以确保名为springSessionRepositoryFilter 的Spring Bean被注册到Servlet容器中并为每次请求提供处理。
  2. AbstractHttpSessionApplicationInitializer也提供了一种机制可以非常容易的确保Spring加载Config。

4.3.2. 基于XML配置JDBC

本节介绍基于XML配置的方式如何使用关系型数据库支持HttpSession。

HttpSession JDBC XML样例提供了一个可执行的样例,这个样例提供了如何基于XML配置整合Spring Session和HttpSession。你可以阅读以下的一些基础步骤,但是当您与自己的应用程序整合时,推荐遵循详细的HttpSession JDBC XML参考指南。

Spring XML配置

添加必要的依赖之后,我们需要创建我们自己的Spring配置。Spring配置主要负责创建一个Spring Session支持的实现去替换HttpSession。Spring配置添加如下:

<context:annotation-config/>
<bean class="org.springframework.session.jdbc.config.annotation.web.http.JdbcHttpSessionConfiguration"/>

<jdbc:embedded-database id="dataSource" database-name="testdb" type="H2">
    <jdbc:script location="classpath:org/springframework/session/jdbc/schema-h2.sql"/>
</jdbc:embedded-database>

<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <constructor-arg ref="dataSource"/>
</bean>
  1. 我们使用context:annotation-config和JdbcHttpSessionConfiguration主要是因为Spring Session没有提供XML命名空间的支持。这就创建了一个实现了Filter的名为springSessionRepositoryFilter 的SpringBean。此过滤器负责使用Spring Session支持的一个实现去替换HttpSession,这个实例中Spring Session由关系型数据库支持。
  2. 我们创建了一个dataSource用于连接Spring Session和一个嵌入的H2数据库实例。我们配置H2数据库使用包含在Spring Session中的SQL脚本创建一张数据表。
  3. 我们创建一个transactionManager去管理前面所创建的数据库的事务。

对于如何配置数据访问的一些相关概念的附加信息,请参考Spring Framework参考文档

XML Servlet容器初始化

Spring配置文件创建了一个实现Filter的名为springSessionRepositoryFilter的Bean。springSessionRepositoryFilter负责使用一个支持Spring Session的个性化实现替换HttpSession。

为了让我们的Filter发挥它的魔力,我们需要指示Spring加载我们的session.xml配置文件,我们按照如下配置指示Spring加载session.xml配置文件。

src/main/webapp/WEB-INF/web.xml(配置文件路径)
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring/*.xml
    </param-value>
</context-param>
<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

ContextLoaderListener读contextConfigLocation并抽出session.xml配置内容。

最后我们需要确保Servlet容器(如Tomcat)的每个请求都使用了springSessionRepositoryFilter,下面的这个代码片段为我们执行了最后一步:

src/main/webapp/WEB-INF/web.xml(配置文件路径)
<filter>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

DelegatingFilterProxy会根据名称springSessionRepositoryFilter去寻找Bean并将其转化成Filter。对于调用DelegatingFilterProxy的每各请求,将调用springSessionRepositoryFilter。

4.3.3. 基于Spring Boot配置JDBC

本节主要介绍在使用Spring Boot的时候如何使用关系型数据库去支持HttpSession。

HttpSession JDBC Spring Boot样例提供了一个可执行的样例,这个样例提供了在使用Spring Boot的时候如何整合Spring Session和HttpSession。你可以阅读以下的一些基础步骤,但是当您与自己的应用程序整合时,推荐遵循详细的HttpSession JDBC Spring Boot参考指南。

Spring Boot配置

在添加完成一些必要的依赖之后,我们需要创建我们自己的Spring Boot配置文件。这里需要感谢first-class自动配置的支持,设置关系型数据库支持Spring Session是非常简单的,简单到只需要在你的application.properties配置文件中添加一条配置信息。

src/main/resources/application.properties(配置文件路径)
spring.session.store-type=jdbc

在以上配置的引导之下,Spring Boot将会应用相当于手动添加@EnableJdbcHttpSession注解的配置。创建一个实现了Filter的名为springSessionRepositoryFilter的Bean(过滤器)。这个过滤器负责使用Spring Session支持的实现去替换HttpSession。

使用application.properties还可以进行更进一步的个性化。

server.session.timeout= # Session超时时间(秒)
spring.session.jdbc.initializer.enabled= #  如果有需要,在启动时可创建必要的Session表。如果默认的表名已经配置或者个性化模式中已经配置,则自动启动。
spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-@@platform@@.sql # 初始化数据库schema的SQL脚本目录。
spring.session.jdbc.table-name=SPRING_SESSION # 用于存储会话的数据库表名。

更多信息,请参考Spring Boot参考文档的Spring Session部分。

配置DataSource

Spring Boot会自动创建DataSource 连接Spring Session和嵌入的H2数据库实例。在生产环境中,你需要确保更新你的配置到你的关系型数据库中。例如,你需要在application.properties包含下列内容:

spring.datasource.url=jdbc:postgresql://localhost:5432/myapp
spring.datasource.username=myapp
spring.datasource.password=secret

mysql建表代码

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;

附上Spingboot官方文档

官方链接https://docs.spring.io/spring-session/docs/2.1.0.M2/reference/html5/#httpsession-jdbc

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
11天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
16天前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
36 5
|
1月前
|
分布式计算 关系型数据库 MySQL
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型 图像处理 光通信 分布式计算 算法语言 信息技术 计算机应用
51 8
|
1月前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
59 9
|
2月前
|
Java 关系型数据库 MySQL
mysql5.7 jdbc驱动
遵循上述步骤,即可在Java项目中高效地集成MySQL 5.7 JDBC驱动,实现数据库的访问与管理。
378 1
|
2月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
175 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
2月前
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
69 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
|
1月前
|
关系型数据库 MySQL Java
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
32 0
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
96 0
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
43 0