SpringBoot 2 整合 Spring Session 最简操作
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中
- on_save
保存时刷新,即响应结束后刷新。默认是 on_save - immediate
实时刷新
也可以通过在启动类上声明@EnableRedisHttpSession进行配置。
例如:@EnableRedisHttpSession(redisFlushMode = RedisFlushMode.ON_SAVE)- 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 最简操作相关推荐
- 在SpringBoot中使用Spring Session解决分布式会话共享问题
在SpringBoot中使用Spring Session解决分布式会话共享问题 问题描述: 每次当重启服务器时,都会导致会员平台中已登录的用户掉线.这是因为每个用户的会话信息及状态都是由session ...
- 项目中Spring Security 整合Spring Session实现记住我功能
Spring Session提供了与Spring Security的"我记得"身份验证的集成的支持: 目的: 更改会话过期长度 确保会话cookie在Integer.MAX_VAL ...
- 在共享dll中使用mfc_在SpringBoot中使用Spring Session解决分布式会话共享问题
作者:简单的土豆 来源:www.jianshu.com/p/e4191997da56 前言 如果你正在使用Java开发Web应用,想必你对HttpSession非常熟悉,但我们知道HpptSessio ...
- 玩转springboot:整合JdbcTemplate访问数据库进行操作
这篇文章我们看一下springboot整合jdbc,做一个小例子来讲解. 数据源配置 在pom.xml文件中导入 <dependency><groupId>org.spring ...
- Web Socket/Stomp——整合Spring Session【Header Token模式】解决方案
官方文档 https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#websocket-stomp-au ...
- 源码通透-mybatis源码分析以及整合spring过程
源码通透-mybatis源码分析以及整合spring过程 mybatis源码分析版本:mybaits3 (3.5.0-SNAPSHOT) mybatis源码下载地址:https://github.co ...
- springboot整合es_[ElasticSearch从入门到场景实战]spring boot集成SpringData操作es
人生起起伏伏,有风光无限日,也有落魄失魂时,人在低谷时,唯有"熬过去,才会赢" 前言 Elasticsearch的Spring Data是Spring Data项目的一部分,Spr ...
- 第九章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 ...
- springBoot整合spring security+JWT实现单点登录与权限管理前后端分离
在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与权限管理. ...
最新文章
- 解析三层架构(1)---为什么要分层?
- 删除所有的.svn文件夹
- 温故知新-[CPP]-Eclipse-CPP中一个Project多个Main
- 【学校作业】学生数据打印
- 我们如何意外地将Hibernate的JDBC流量增加了一倍
- C#泛型委托Predicate、Action、Func
- 要不要借钱给好朋友?救急不救贫
- 黄冈学计算机的学校怎么样,黄冈学计算机的学校
- 活动目录建立IIS站点
- sqlserver 没有维护计划_设定数据库备份计划,安全放心不怕事!
- html table 显示最后一条,漂亮CSS表格(Table),最后一行是汇总行【实例】
- python模块之feedparser学习使用
- Java学习-基础篇(1)
- 中国石油焦市场供需态势及投资潜力预测报告2021年版
- mt6573芯片资料汇总
- latex formula
- 只要付出了努力,总会有回报的
- 网址短连接 short url
- 适合后台管理系统开发的前端框架
- 基于linux的智能小车_基于ARM10与LINUX智能小车系统设计.doc
热门文章
- mysql1000w数据怎么加索引_给mysql一百万条数据的表添加索引
- OpenShift 4 - Istio-Tutorial (2) 部署三个微服务
- MYSQL学习(一) - 数据结构
- 依赖反转原理,IoC容器和依赖注入:第3部分
- VSCode 6 月 Java 更新,编辑器就该有编辑器的样子
- gdal mysql乱码_GDAL读取S-57海图数据中文属性值乱码问题解决(续)
- django objects.filter().exists()
- 将angular转化为手机app_手机照片快速转化为PBR材质流程
- python打包程序出错_pyinstaller 打包exe,出错,换了个简单的.py文件也不行
- 注册名字英文name域名_关于域名和备案,你想知道的都在这里