SpringBoot 2 整合 SpringSession

  • 前言
  • Spring Session 介绍
  • SpringBoot 快速整合 Spring Session
  • Spring Session 测试
    • 负责获取分布式 Session 的配置和代码:
    • 负责创建分布式 Session 的配置和代码:
  • SpringBoot 整合 Spring Session 自定义配置介绍
  • 小结
  • 代码示例

前言

通过该篇博客,你将了解到如何快速通过 SpringBoot 2 + Spring Session 来实现分布式 Session 环境的搭建。

Spring Session 介绍

SpringBoot 整合 Spring Session 前,先了解一下什么是 Spring Sessin。

Spring 官方 (https://spring.io/projects/spring-session)关于 Spring Session 介绍如下:

Spring Session provides an API and implementations for managing a user’s session information.
Spring Session makes it trivial to support clustered sessions without being tied to an application container specific solution. It also provides transparent integration with:

  • HttpSession - allows replacing the HttpSession in an application container (i.e. Tomcat) neutral way, with support for providing
    session IDs in headers to work with RESTful APIs
  • WebSocket - provides the ability to keep the HttpSession alive when receiving WebSocket messages
  • WebSession - allows replacing the Spring WebFlux’s WebSession in an application container neutral way

中文翻译如下 :

Spring Session提供了用于管理用户会话信息的API和实现。
Spring Session使得支持集群会话变得微不足道,而不依赖于特定于应用程序容器的解决方案。它还提供透明集成:

  • HttpSession - 允许以应用程序容器(即Tomcat)中立的方式替换HttpSession,支持在头文件中提供会话ID以使用RESTful API
  • WebSocket - 提供在接收WebSocket消息时保持HttpSession活动的能力
  • WebSession - 允许以应用程序容器中立方式替换Spring WebFlux的WebSession

从官方介绍中可以了解到 Spring Session 是用来解决,集群下实现全局 Session的一个框架实现。全局 Session 也可以理解成分布式Session。那什么是分布式Session呢?

分布式Session 就是我们的 Session 会话对于集群中的每个服务共享。我这里举一个例子:

假如一个商品服务通过2台机器 A和B 进行集群部署,用户访问 A服务器登录成功后,将此用户Session信息保存在 A 服务器上。突然A服务器突然宕机,用户访问跳转B服务器上。此时B服务器上并没有A服务的 Session。用户需要再次执行登录操作。而Spring Session 可以将用户登录后的Session 保存在Redis或者数据库中,当 A 服务器宕机切换到 B 服务器时,此时B服务器从Redis中获取Session,无需在进行登录操作。

SpringBoot 快速整合 Spring Session

该篇博客介绍 Spring Session 通过 Redis 存储Session的方式来实现。
在整合前你首先应该在本地或者远程的机器上安装 redis 服务,可以参考 Windows 安装 Redis
教程。其他系统可以百度或者期待我后续的博客教程。

SpringBoot 和 Spring Session 整合的配置需要引入2个 start依赖:

  • spring-session-data-redis
  • spring-boot-starter-data-redis

具体代码如下:

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

如果你的 Redis服务是单机版默认配置,并且和你的 SpringBoot 应用在同台机器上。SpringBoot 和 Spring Session 的整合就搞定了。是不是很简单哈。

如果你的Redis服务在远程的机器上,那么你需要在 application.properties 配置文件中配置一下 Redis的主机ip 和 端口号即可。
spring.redis.host=远程 Redis 服务主机 IP
spring.redis.port=远程 Redis

如果你的单机版Redis服务不是默认配置, 那么你需要像远程Redis服务一样进行配置其 主机ip 和端口号。

Spring Session 测试

创建 2个SpringBoot 应用实例, 通过设置不同的端口号进行区分。2个 SpringBoot 应用实例。一个负责创建Session、 一个负责获取Session。

负责获取分布式 Session 的配置和代码:

application.properties 配置如下:

server.port=8090
server.servlet.context-path=/sbe
spring.redis.host=localhost

获取Session 测试代码如下:

@RestController
@RequestMapping("/session")
public class SpringSessionTestController {@RequestMapping("/get/{name}")public String getSesseion(HttpServletRequest request,@PathVariable("name") String name){HttpSession session = request.getSession();String value = (String)session.getAttribute(name);return "sessionId:"+session.getId()+" value:"+value;}
}

负责创建分布式 Session 的配置和代码:

application.properties 配置如下:

server.port=8080
server.servlet.context-path=/sbe
spring.redis.host=localhost

创建Session测试代码如下:

@RestController
@RequestMapping("/session")
public class SpringSessionTestController {@RequestMapping("/add/{name}/{value}")public String addSession(HttpServletRequest request,@PathVariable("name") String name,@PathVariable("value") String value){HttpSession session = request.getSession();session.setAttribute(name,value);return "sessionId:"+session.getId()+" name:"+name;}
}

测试结果如下图所示:

SpringBoot 整合 Spring Session 自定义配置介绍

在快速整合的介绍中 我们使用都是默认的配置。如果你想自定义定义 Session 过期时间 、session的刷新模式 、存储Session的命名空间。可以通过在 application.properties 中进行配置。

具体配置介绍如下:

  • spring.session.store-type=redis

    设置 Spring Session 使用 Redis 进行存储。默认配置就是 redis

  • spring.session.timeout=10m
    设置 Spring Session 的过期时间。如果不指定单位模式是 s。
    也可以通过在启动类上声明@EnableRedisHttpSession进行配置。
    例如:@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)

  • spring.session.redis.flush-mode=on_save

    session刷新模式,有2中

    1. on_save
      保存时刷新,即响应结束后刷新。默认是 on_save
    2. immediate
      实时刷新

    也可以通过在启动类上声明@EnableRedisHttpSession进行配置。
    例如:@EnableRedisHttpSession(redisFlushMode = RedisFlushMode.ON_SAVE)

  • spring.session.redis.namespace=redis:session

    存储 Session的命名空间,默认是spring:session。

    通过 Redis Desktop Manager 可以查看存储到Redis中的session信息的key都是以
    spring:session打头的。

命名空间主要是用于多个服务之间进行区分 。

也可以通过在启动类上声明@EnableRedisHttpSession进行配置。
例如:@EnableRedisHttpSession(redisNamespace=“xxxx”)

小结

通过在 SpirngBoot 项目中引入Spring Session 和 SpringBoot 整合 Redis 的 start 依赖,我们可以快速搭建分布式 Session 环境,同时也可以在 application.properties 中自定义 Session 的过期时间、命名空间、刷新模式的配置。

代码示例

具体代码示例请查看 :
博客的读者可以通过查看下面仓库的中的模块工程名:spring-boot-2.x-spring-session-1 和spring-boot-2.x-spring-session-2

Github:
https://github.com/zhuoqianmingyue/springbootexamples/tree/master/spring-boot-2.x-spring-session-1 (获取Session)
https://github.com/zhuoqianmingyue/springbootexamples/tree/master/spring-boot-2.x-spring-session-2 (创建Session)

如果您对这些感兴趣,欢迎 star、或转发给予支持!转发请标明出处!

SpringBoot 2 整合 Spring Session 最简操作相关推荐

  1. 在SpringBoot中使用Spring Session解决分布式会话共享问题

    在SpringBoot中使用Spring Session解决分布式会话共享问题 问题描述: 每次当重启服务器时,都会导致会员平台中已登录的用户掉线.这是因为每个用户的会话信息及状态都是由session ...

  2. 项目中Spring Security 整合Spring Session实现记住我功能

    Spring Session提供了与Spring Security的"我记得"身份验证的集成的支持: 目的: 更改会话过期长度 确保会话cookie在Integer.MAX_VAL ...

  3. 在共享dll中使用mfc_在SpringBoot中使用Spring Session解决分布式会话共享问题

    作者:简单的土豆 来源:www.jianshu.com/p/e4191997da56 前言 如果你正在使用Java开发Web应用,想必你对HttpSession非常熟悉,但我们知道HpptSessio ...

  4. 玩转springboot:整合JdbcTemplate访问数据库进行操作

    这篇文章我们看一下springboot整合jdbc,做一个小例子来讲解. 数据源配置 在pom.xml文件中导入 <dependency><groupId>org.spring ...

  5. Web Socket/Stomp——整合Spring Session【Header Token模式】解决方案

    官方文档 https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#websocket-stomp-au ...

  6. 源码通透-mybatis源码分析以及整合spring过程

    源码通透-mybatis源码分析以及整合spring过程 mybatis源码分析版本:mybaits3 (3.5.0-SNAPSHOT) mybatis源码下载地址:https://github.co ...

  7. springboot整合es_[ElasticSearch从入门到场景实战]spring boot集成SpringData操作es

    人生起起伏伏,有风光无限日,也有落魄失魂时,人在低谷时,唯有"熬过去,才会赢" 前言 Elasticsearch的Spring Data是Spring Data项目的一部分,Spr ...

  8. 第九章SpringBoot整合Spring Data JPA

    目录 1 概述 2 Spring Data JPA整合 2.1 pom文件 2.2 配置文件 2.3 实体类 2.4 Dao接口 2.5 启动类 2.6 编写测试类 3 Spring Data JPA ...

  9. springBoot整合spring security+JWT实现单点登录与权限管理前后端分离

    在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与权限管理. ...

最新文章

  1. 解析三层架构(1)---为什么要分层?
  2. 删除所有的.svn文件夹
  3. 温故知新-[CPP]-Eclipse-CPP中一个Project多个Main
  4. 【学校作业】学生数据打印
  5. 我们如何意外地将Hibernate的JDBC流量增加了一倍
  6. C#泛型委托Predicate、Action、Func
  7. 要不要借钱给好朋友?救急不救贫
  8. 黄冈学计算机的学校怎么样,黄冈学计算机的学校
  9. 活动目录建立IIS站点
  10. sqlserver 没有维护计划_设定数据库备份计划,安全放心不怕事!
  11. html table 显示最后一条,漂亮CSS表格(Table),最后一行是汇总行【实例】
  12. python模块之feedparser学习使用
  13. Java学习-基础篇(1)
  14. 中国石油焦市场供需态势及投资潜力预测报告2021年版
  15. mt6573芯片资料汇总
  16. latex formula
  17. 只要付出了努力,总会有回报的
  18. 网址短连接 short url
  19. 适合后台管理系统开发的前端框架
  20. 基于linux的智能小车_基于ARM10与LINUX智能小车系统设计.doc

热门文章

  1. mysql1000w数据怎么加索引_给mysql一百万条数据的表添加索引
  2. OpenShift 4 - Istio-Tutorial (2) 部署三个微服务
  3. MYSQL学习(一) - 数据结构
  4. 依赖反转原理,IoC容器和依赖注入:第3部分
  5. VSCode 6 月 Java 更新,编辑器就该有编辑器的样子
  6. gdal mysql乱码_GDAL读取S-57海图数据中文属性值乱码问题解决(续)
  7. django objects.filter().exists()
  8. 将angular转化为手机app_手机照片快速转化为PBR材质流程
  9. python打包程序出错_pyinstaller 打包exe,出错,换了个简单的.py文件也不行
  10. 注册名字英文name域名_关于域名和备案,你想知道的都在这里