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方式来进行验证的系统来说是一种简便、快速、低成本的一种实现思路。

相关文章
|
8月前
|
数据可视化 Java BI
将 Spring 微服务与 BI 工具集成:最佳实践
本文探讨了 Spring 微服务与商业智能(BI)工具集成的潜力与实践。随着微服务架构和数据分析需求的增长,Spring Boot 和 Spring Cloud 提供了构建可扩展、弹性服务的框架,而 BI 工具则增强了数据可视化与实时分析能力。文章介绍了 Spring 微服务的核心概念、BI 工具在企业中的作用,并深入分析了两者集成带来的优势,如实时数据处理、个性化报告、数据聚合与安全保障。同时,文中还总结了集成过程中的最佳实践,包括事件驱动架构、集中配置管理、数据安全控制、模块化设计与持续优化策略,旨在帮助企业构建高效、智能的数据驱动系统。
405 1
将 Spring 微服务与 BI 工具集成:最佳实践
|
10月前
|
XML 人工智能 Java
Spring Boot集成Aviator实现参数校验
Aviator是一个高性能、轻量级的Java表达式求值引擎,适用于动态表达式计算。其特点包括支持多种运算符、函数调用、正则匹配、自动类型转换及嵌套变量访问,性能优异且依赖小。适用于规则引擎、公式计算和动态脚本控制等场景。本文介绍了如何结合Aviator与AOP实现参数校验,并附有代码示例和仓库链接。
630 0
|
10月前
|
安全 Java 数据库
第16课:Spring Boot中集成 Shiro
第16课:Spring Boot中集成 Shiro
1096 0
|
10月前
|
消息中间件 存储 Java
第15课: Spring Boot中集成ActiveMQ
第15课: Spring Boot中集成ActiveMQ
648 0
|
11月前
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
1162 0
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
641 0
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
481 0
|
NoSQL Java 关系型数据库
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
本文介绍在 Spring Boot 中集成 Redis 的方法。Redis 是一种支持多种数据结构的非关系型数据库(NoSQL),具备高并发、高性能和灵活扩展的特点,适用于缓存、实时数据分析等场景。其数据以键值对形式存储,支持字符串、哈希、列表、集合等类型。通过将 Redis 与 Mysql 集群结合使用,可实现数据同步,提升系统稳定性。例如,在网站架构中优先从 Redis 获取数据,故障时回退至 Mysql,确保服务不中断。
457 0
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
|
8月前
|
监控 Cloud Native Java
Spring Integration 企业集成模式技术详解与实践指南
本文档全面介绍 Spring Integration 框架的核心概念、架构设计和实际应用。作为 Spring 生态系统中的企业集成解决方案,Spring Integration 基于著名的 Enterprise Integration Patterns(EIP)提供了轻量级的消息驱动架构。本文将深入探讨其消息通道、端点、过滤器、转换器等核心组件,以及如何构建可靠的企业集成解决方案。
748 0