详解基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案

所属分类: 软件编程 / java 阅读数: 25
收藏 0 赞 0 分享

分布式Web网站一般都会碰到集群session共享问题,之前也做过一些Spring3的项目,当时解决这个问题做过两种方案,一是利用nginx,session交给nginx控制,但是这个需要额外工作较多;还有一种是利用一些tomcat上的插件,修改tomcat配置文件,让tomcat自己去把Session放到Redis/Memcached/DB中去。这两种各有优缺,也都能解决问题。

但是现在项目全线Spring Boot,并不自己维护Tomcat,而是由Spring去启动Tomcat。这样就会有一个问题:在服务器上并不存在一个持久存在的Tomcat程序,这样也无从去修改Tomcat的配置文件了。经过了一番搜索,发现Spring果然对这个问题有自己的解决方案,那就是Spring-Session.

 Spring-Session是通过过滤器实现的session共享,具体原理可以自己去官网查,这里只说一下如何配置。整个项目基于Spring Boot,如果不是Boot项目就需要自己去调整了。

项目需要先准备一个Redis服务,在本地启动一个即可。还需要有一个已经使用session但是未做session共享的Spring Boot项目,下面我就讲述一下如何给这个项目加上基于redis的session共享。

 引入依赖

首先,要在maven中加入以下依赖:

<dependencies>
    <!-- ... -->

    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session</artifactId>
        <version>1.2.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-redis</artifactId>
    </dependency>

    <dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
    <version>1.2.2.RELEASE</version>
    <type>pom</type>
    </dependency>


</dependencies>

这些就是Spring-Session和Redis相关的依赖。

 配置Redis

在项目目前在使用的properties文件中,加入如下配置:

spring.redis.host=localhost

spring.redis.password=secret

spring.redis.port=6379 

host就是redis地址,password为密码,port为端口号。

 Spring配置

在项目的目录中,创建一个Config.java文件(名称随意)

@Configuration

@EnableRedisHttpSession

public class Config {

 

    @Bean

    public JedisConnectionFactory connectionFactory() {

        return new JedisConnectionFactory(); 

    }

} 

@EnableRedisHttpSession这个注解就是最重要的东西,加了它之后,spring生产一个新的拦截器,用来实现Session共享的操作,具体实现这里暂不展开。而配置的这个Bean,则是让Spring根据配置文件中的配置连到Redis。

如果不使用Security,下面的几步就不用做了,这个类中配置的Bean也不用配置。

Spring Security 配置

在项目中添加该类:

public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer {

 

    public SecurityInitializer() {

        super(SecurityConfig.class, Config.class);

    }

} 

super()的第二个参数,就是我们上面的那个Config文件。添加这个配置文件后,Spring Security就会把Session放到Redis中,这样基于Spring Security的项目也可以实现Session共享了。

Initializer 配置

这一步写法异常简单,还是创建文件:

public class Initializer extends AbstractHttpSessionApplicationInitializer {} 

就这样,继承一个类即可。

 大功告成!简单的超乎想像,这就是Spring Boot的优势所在。下面我们来自己登录一下,看看Spring Security是否把Session放到Redis中。

(登录过程我就不讲了,,在自己项目中调用一下Security的登录即可)

然后用redis-cli连接到redis,执行keys *

会看到如下:

你会发现redis里多了一堆以spring:session:***为key的东西,这样就说明Spring Security确实把Session放到了我们配置的redis中。这样就可以实现session共享了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Java concurrency线程池之线程池原理(三)_动力节点Java学院整理

这篇文章主要为大家详细介绍了Java concurrency线程池之线程池原理第三篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java concurrency线程池之线程池原理(四)_动力节点Java学院整理

这篇文章主要为大家详细介绍了Java concurrency线程池之线程池原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java class文件格式总结_动力节点Java学院整理

这篇文章主要介绍了Java class文件格式总结的相关资料,非常不错,具有参考借鉴价值,需要的的朋友参考下吧
收藏 0 赞 0 分享

Java concurrency线程池之Callable和Future_动力节点Java学院整理

这篇文章主要为大家详细介绍了Java concurrency线程池之Callable和Future,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java Collections.sort()实现List排序的默认方法和自定义方法

这篇文章主要介绍了Java Collections.sort()实现List排序的默认方法和自定义方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

解决调试JDK源码时,不能查看变量的值问题

下面小编就为大家带来一篇解决调试JDK源码时,不能查看变量的值问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Spring Boot项目利用Redis实现session管理实例

本篇文章主要介绍了Spring Boot项目利用Redis实现session管理实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

详解基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案

本篇文章主要介绍了详解基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java中精确的浮点运算操作示例

这篇文章主要介绍了Java中精确的浮点运算操作方法,结合具体实例形式分析了java浮点数运算的相关函数、使用技巧与注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

Spring Data JPA+kkpager实现分页功能实例

本篇文章主要介绍了Spring Data JPA+kkpager实现分页功能实例,具有一定的参考价值,有兴趣的可以了解一下
收藏 0 赞 0 分享
查看更多