基于Spring-Session实现会话共享

1 基于Spring-Session实现会话共享

Note:以下方法基于官网session部分进行实现

1.1 Session共享的实现方式

  1. 基于Redis实现
  2. 基于JDBC实现
  3. 基于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.sessiongroupId>
    <artifactId>spring-session-1.3.1artifactId>
    <version>1.3.1.RELEASEversion>
    <scope>systemscope>
    <systemPath>${project.basedir}/src/lib/spring-session-1.3.1.RELEASE.jarsystemPath>
dependency>

<dependency>
    <groupId>org.springframework.sessiongroupId>
    <artifactId>spring-session-core-2.0.2artifactId>
    <version>2.0.2.RELEASEversion>
    <scope>systemscope>
    <systemPath>${project.basedir}/src/lib/spring-session-core-2.0.2.RELEASE.jarsystemPath>
dependency>

1.2.2 配置DataSource源

Note:基于jdbc实现session共享的原理:

spring-session框架基于jdbc实现session共享,即会将session id存入指定的数据库中进行存储和管理,因此在不同的分布式环境中,所有服务都是从同一个数据库表中获取session id,由此来进行session的共享,因此,基于spring session框架实现session共享,需配置DataSource数据源,实现@EnableJdbcHttpSession下的相关逻辑,并进行服务启动时的相关配置;

  1. 使用@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

你可能感兴趣的:(Spring,Boot,spring,java,数据库)