spring-boot+spring-session集成

在这个微服务,分布式的时代,不少传统的实现方案变的再也不那么适用,好比传统的web服务将session放在内存中的状况,当web服务作水平扩展部署的时候,session共享就成了须要处理的问题。目前有不少成熟的技术可供咱们选择,下面简单介绍最近用到的spring-boot+spring-session实现session共享的方案。java

spring-boot集成spring-session很是简单,由于spring-boot为咱们完成了很是多的工做。具体集成步骤以下:web

1、工程继承spring-boot-starter-parent
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
</parent>

这样作的好处是咱们接下来引入其余依赖包能够不须要考虑版本问题,推荐这样作,避免本身引入不当致使的兼容性问题。redis

2、引入spring-session依赖包
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session</artifactId>
</dependency>

引入以后,咱们要肯定咱们要将session持久化到哪一种介质中了。由于分布式session能够持久化到数据库、redis、nosql等中,根据存储方式不一样,须要引入不一样的jar包和作不一样的操做。咱们以redis存储为例。spring

3、引入redis依赖包
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

因为咱们使用了spring-boot,因此咱们只须要引入spring-boot-starter-data-redis依赖便可,这样咱们能够很好的利用spring-boot开箱即用以及很是方便的配置优点。sql

4、基础配置

因为咱们引入了redis,这样咱们须要在application.properties或者application.yml文件中配置redis链接,使用spring-boot咱们能够很方便配置单点redis,哨兵模式,集群模式等,简单起见咱们配置一个单点模式的redis链接并采用链接池数据库

spring.redis.port=6379
spring.redis.host=127.0.0.1
spring.redis.pool.max-active=100
spring.redis.pool.max-idle=5
spring.redis.pool.max-wait=60000

完成以上步骤以后,咱们只须要告诉spring开启redis方式的session存储便可,这里有两种方式能够实现浏览器

方式一、在配置文件中添加一行配置
spring.session.store-type=redis

方式二、在程序启动类上添加注解
@EnableRedisHttpSession

两种方式均可以完成开启spring-session的redis存储,是否是很是简单。由于spring-boot的特性,之前不少须要在xml中配置的均可以轻松帮咱们搞定。cookie

虽然咱们实现了redis方式存储的分布式session,可是在实际场景中可能还有一些须要优化的地方。session

1、修改cookies中sessionId的名字

2、修改session存放在redis中的命名空间

3、修改session超时时间

为何要这样作呢,若是咱们有两套不一样系统A和B,cookies中session名称相同会致使同一个浏览器登陆两个系统会形成相互的干扰,例如两个系统中咱们存放在session中的用户信息的键值为user。默认状况下cookies中的session名称为JSESSIONID。当咱们登陆A系统后,在同一个浏览器下打开B系统,B系统B系统拿到的user实际上并不是本身系统的user对象,这样会形成系统异常;而若是咱们A、B系统存放用户信息的键值设置为不相同,例如userA和userB,当咱们登陆A系统后在登陆B系统,咱们打开浏览器调试模式方向两个系统只有一个sessionId,由于咱们没有对两者的session名称以及存储的命名空间作区分,程序会认为就是本身可用的session。当咱们推出B系统,注销session后。发现B系统的session也失效了,由于在redis中JSESSIONID对应的数据已经被设置过时了。app

同理,若是两个系统想要不一样的session过时时间,也存在相同的问题。因此,建议不一样系统,session名称以及存储的命名空间设置为不一样,固然相同系统的水平扩展实例的状况除外。

针对命名空间,咱们能够在配置文件上添加配置解决

spring.session.redis.namespace=xxxx

若是是注解方式的也能够在注解上设置

@EnableRedisHttpSession(redisNamespace="xxxx")

这样咱们查看redis中就能够看到sping-session存储的key就变成了咱们设置的值。

针对超时时间,注解方式提供了响应的设置

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)

可是配置文件方式并无提供响应的直接设置。
咱们能够采用javaconfig方式自定义策略来设置超时以及设置cookies名称,以下咱们设置超时时间是1800秒,cookies名为MYSESSIONID

@Bean
public CookieHttpSessionStrategy cookieHttpSessionStrategy(){
        CookieHttpSessionStrategy strategy=new CookieHttpSessionStrategy();
        DefaultCookieSerializer cookieSerializer=new DefaultCookieSerializer();
        cookieSerializer.setCookieName("MYSESSIONID");//cookies名称
        cookieSerializer.setCookieMaxAge(1800);//过时时间(秒)
        strategy.setCookieSerializer(cookieSerializer);
        return strategy;
}

#最后
经过以上步骤,咱们就完成了分布式session的集成。相对于传统的内存方式,分布式session实现可以更方便水平扩展以及系统维护。对于不想立马更改系统采用token方式来进行验证的系统来讲是一种简便、快速、低成本的一种实现思路。

本文地址:“https://yq.aliyun.com/articles/182676?utm_content=m_29523

相关文章
相关标签/搜索