1 基于Spring-Session实现会话共享
Note:以下方法基于官网session部分进行实现
1.1 Session共享的实现方式
- 基于Redis实现
- 基于JDBC实现
- 基于Java实现
而每种实现方式的具体细节有所不同,分别又分为XML、@Configuration注解、Java三种方式来进行实现;
当前采用基于JDBC的注解方式进行实现。
1.2 JDBC+SpringBoot注解方式实现会话共享
前提:具备分布式的部署环境,目前采用lvs(ipvsadm+DR+RS)库实现的分布式部署以及路由管理;
1.2.1 基础库
先获取spring-session-1.3.1.RELEASE.jar,拷贝到/src/lib目录下,然后在项目的pom.xml文件添加如下依赖
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-1.3.1</artifactId>
<version>1.3.1.RELEASE</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/lib/spring-session-1.3.1.RELEASE.jar</systemPath>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-core-2.0.2</artifactId>
<version>2.0.2.RELEASE</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/lib/spring-session-core-2.0.2.RELEASE.jar</systemPath>
</dependency>
1.2.2 配置DataSource源
Note:基于jdbc实现session共享的原理:
spring-session框架基于jdbc实现session共享,即会将session id存入指定的数据库中进行存储和管理,因此在不同的分布式环境中,所有服务都是从同一个数据库表中获取session id,由此来进行session的共享,因此,基于spring session框架实现session共享,需配置DataSource数据源,实现@EnableJdbcHttpSession下的相关逻辑,并进行服务启动时的相关配置;
- 使用@EnableJdbcHttpSession注解标记Session 共享的配置类,并实现dataSource以及transactionManager两个必要方法:
@Slf4j
@EnableJdbcHttpSession
public class DmSessionConfig {
@Autowired
private Environment environment;
@Bean
public DataSource dataSource() {
SimpleDriverDataSource dmDataSource = initDmDataSource();
//配置data source数据库源成功后,Spring Session会自动创建session表并对Session数据进行管理
//注意,旧版SpringSession与新版所创建的表结构不一致,应根据现有的数据库SPRING_SESSION表结构进行lib选择
return dmDataSource;
}
private SimpleDriverDataSource initDmDataSource() {
SimpleDriverDataSource dmDataSource = new SimpleDriverDataSource();
String databaseUrl = environment.getProperty(Constant.PROPERTY_DATASOURCE_URL);
String username = environment.getProperty(Constant.PROPERTY_DATASOURCE_USER_NAME);
String password = environment.getProperty(Constant.PROPERTY_DATASOURCE_USER_PASSWORD);
this.log.info("databaseUrl:"+databaseUrl);
//设置达梦数据库的驱动类
dmDataSource.setDriverClass(DmDriver.class);
dmDataSource.setUsername(username);
dmDataSource.setPassword(password);
dmDataSource.setUrl(databaseUrl);
return dmDataSource;
}
@Bean(name = "platformTransactionManager")
public PlatformTransactionManager transactionManager(DataSource dataSource) {
this.log.info("set data source:" + dataSource);
return new DataSourceTransactionManager(dataSource);
}
}
到此,SpringBoot+SpringSession+JDBC方式的session 共享实现已经完成,具体的细节修改可参考
Spring Http Session官方文档: https://docs.spring.io/spring-session/docs/current/reference/html5/index.html#httpsession