spring-boot+spring-session集成

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

spring-boot集成spring-session非常简单,因为spring-boot为我们完成了非常多的工作。具体集成步骤如下:

一、工程继承spring-boot-starter-parent

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
</parent>

这样做的好处是我们接下来引入其他依赖包可以不需要考虑版本问题,推荐这样做,避免自己引入不当导致的兼容性问题。

二、引入spring-session依赖包

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session</artifactId>
</dependency>

引入之后,我们要确定我们要将session持久化到哪种介质中了。因为分布式session可以持久化到数据库、redis、nosql等中,根据存储方式不同,需要引入不同的jar包和做不同的操作。我们以redis存储为例。

三、引入redis依赖包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

由于我们使用了spring-boot,所以我们只需要引入spring-boot-starter-data-redis依赖即可,这样我们可以很好的利用spring-boot开箱即用以及非常方便的配置优势。

四、基础配置
由于我们引入了redis,这样我们需要在application.properties或者application.yml文件中配置redis连接,使用spring-boot我们可以很方便配置单点redis,哨兵模式,集群模式等,简单起见我们配置一个单点模式的redis连接并采用连接池

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

完成以上步骤之后,我们只需要告诉spring开启redis方式的session存储即可,这里有两种方式可以实现

  • 方式1、在配置文件中添加一行配置
spring.session.store-type=redis
  • 方式2、在程序启动类上添加注解
@EnableRedisHttpSession

两种方式都可以完成开启spring-session的redis存储,是不是非常简单。因为spring-boot的特性,以前很多需要在xml中配置的都可以轻松帮我们搞定。

扩展

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

一、修改cookies中sessionId的名字

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

三、修改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对应的数据已经被设置过期了。

同理,如果两个系统想要不同的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方式来进行验证的系统来说是一种简便、快速、低成本的一种实现思路。

时间: 2024-10-28 05:53:08

spring-boot+spring-session集成的相关文章

Spring boot +Spring Security + Thymeleaf 认证失败返回错误信息

  [Please make sure to select the branch corresponding to the version of Thymeleaf you are using] Status This is a thymeleaf extras module, not a part of the Thymeleaf core (and as such following its own versioning schema), but fully supported by the

Spring Boot &amp; Spring Cloud 应用内存管理

本文讲的是Spring Boot & Spring Cloud 应用内存管理,在整体应用架构中,非生产环境情况下,一般 1GB 或者 2GB 的 RAM 就足够了.如果我们将这个应用程序划分为 20 或 30 个独立的微服务,那么很难期望 RAM 仍将保持在 1GB 或 2GB 左右.特别是如果我们使用 Spring Cloud 的时候. 首先,准备三个服务,Eureka 服务 + 提供 REST API 的两个简单的微服务,并将微服务注册到 Eureka.此处,不以任何方式限制这些应用程序的内

5.10. Spring boot with Session share

5.10.1. Redis 5.10.1.1. Maven 增加下面代码到pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springfra

2.10. Spring boot with Session share

2.10.1. Redis 2.10.1.1. Maven 增加下面代码到pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springfra

How to use JDBC-Authentication of Spring Boot/Spring Security with Flyway

  java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) at org.springframework.test.context.sup

学习SPRING BOOT, SPRING CLOUD之Eureka和security

有意思,明天去杨浦报名了一个SPRING CLOUD沙龙, 今天再抓紧看看哈哈哈. Eureka服务端: EurekaApplication.java package com.packtpub.Eureka; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframewor

Spring Boot集成持久化Quartz定时任务管理和界面展示

前言 本文是对之前的一篇文章Spring+SpringMVC+mybatis+Quartz整合代码部分做的一个修改和补充, 其中最大的变化就是后台框架变成了Spring Boot. 本工程所用到的技术或工具有: Spring Boot Mybatis Quartz PageHelper VueJS ElementUI MySql数据库 正文 配置 本例中仍然是使用mysql数据库作为Quartz任务持久化的存储载体.对于如何在Mysql数据库中建立表,在上一篇Spring+SpringMVC+m

使用Spring Session实现Spring Boot水平扩展

本文使用Spring Session实现了Spring Boot水平扩展,每个Spring Boot应用与其他水平扩展的Spring Boot一样,都能处理用户请求.如果宕机,Nginx会将请求反向代理到其他运行的Spring Boot应用上,如果系统需要增加吞吐量,只需要再启动更多的Spring Boot应用即可. Spring Boot应用通常会部署在多个Web服务器上同时提供服务,这样做有很多好处: 单个应用宕机不会停止服务,升级应用可以逐个升级而不必停止服务. 提高了应用整体的吞吐量.

57. Spring 自定义properties升级篇【从零开始学Spring Boot】

 注解ConfigurationProperties和EnableAutoConfiguration的区别: @EnableConfigurationProperties tells Spring to treat this class as a consumer of application.yml/properties values( {@link ConfigurationProperties} beans can be registered in the standard way (fo

Spring Cloud连载(3)Spring Boot简介与配置

本站小福利 点我获取阿里云优惠券 原文作者:杨大仙的程序空间 3 Spring Boot简介与配置   3.1 Spring Boot         Spring Cloud基于Spring Boot搭建,本小节将对Spring Boot作一个大致的讲解,读者知道Spring Boot作用即可. 3.1.1 Spring Boot简介         开发一个全新的项目,需要先进行开发环境的搭建,例如要确定技术框架以及版本,还要考虑各个框架之间的版本兼容问题,完成这些繁琐的工作后,还要对新项目