SpringBoot中实现分布式的Session共享的详细教程
作者:千锋教育官方博客 发布时间:2023-08-23 18:23:43
一. SpringBoot中实现Session共享
1. 创建web项目
我们按照之前的经验,创建一个web程序,并将之改造成Spring Boot项目,具体过程略。
2.添加依赖包
<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>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-core</artifactId>
</dependency>
3.创建application.yml文件
server:
port: 8080
#配置redis
spring:
redis:
host: 127.0.0.1
port: 6379
#password: 123456
jedis:
pool:
max-idle: 8
min-idle: 0
max-active: 8
#max-wait: 60000
#timeout: 3000 #超时一定要大于0
session:
#设置session存储类型
store-type: redis
这里可以设置多种session的store-type:
我们这里选择利用redis来对session进行集中存储,实现session共享。
4.创建Session配置类
package com.yyg.boot.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
/**
* @Author 一一哥Sun
* @Date Created in 2020/4/28
* @Description 开启Redis Http Session
*/
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)
public class RedisHttpSessionConfiguration {
}
在这里添加@EnableRedisHttpSession注解,可以通过maxInactiveIntervalInSeconds属性设置Session的过期时间。
5.创建一个Controller接口方法
该接口方法当用户不存在时提示“用户不存在”,否则会提示“用户存在”。
package com.yyg.boot.web;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* @Author 一一哥Sun
* @Date Created in 2020/4/28
* @Description Description
*/
@Slf4j
@RestController
public class SessionController {
@RequestMapping("/session")
public Object springSession(@RequestParam("username") String username, HttpServletRequest request, HttpSession session) {
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie cookie : cookies) {
log.warn(cookie.getName() + "=" + cookie.getValue());
}
}
Object value = session.getAttribute("username");
if (value == null) {
log.warn("用户不存在");
//保存session
session.setAttribute("username", "{username: '" + username + "', age: 30}");
} else {
log.warn("用户存在");
}
return "username=" + value;
}
}
6.创建入口类
package com.yyg.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author 一一哥Sun
* @Date Created in 2020/4/28
* @Description Description
*/
@SpringBootApplication
public class SpringSessionApplication {
public static void main(String[] args){
springapplication.run - 这个网站可出售。 - 最佳的springapplication 来源和相关信息。(SpringSessionApplication.class,args);
}
}
7.完整项目结构
8.启动项目进行测试
第一次在浏览器中进行访问,会看到浏览器中的username=null,并且控制台中展示的log信息为“用户不存在”,说明此时还没有创建出session。但是当第一次访问之后,session就被创建出来了,并且被存储到了redis中,实现了持久化存储。可以看如下图:
第二次访问,就会看到username已经可以获取到新的信息了。
log控制台中也看到已经提示“用户存在”的信息了。
并且我们可以看到Redis控制台中,提示了TTL过期时间是3660,每隔1秒钟刷新1次,3600秒后过期。
此时我们可以分别启动一个8080和8081进程,在两个进程上分别测试session接口。
#进入到项目的target目录下,执行java -jar命令,部署我们的jar包
F:\onlineWorks\boot-demos\demo43_springsession\target>java -jar demo43_springsession-1.0-SNAPSHOT.jar --server.port=8080
F:\onlineWorks\boot-demos\demo43_springsession\target>java -jar demo43_springsession-1.0-SNAPSHOT.jar --server.port=8081
在浏览器中,我们的8080和8081端口上访问时,可以看到有一个共同的Session信息:
可以看到在两个不同的进程端口上,都分别访问到了同一个session信息,说明我们实现了分布式进程中session共享。可见在有了Spring Session后,实现session共享还是很简单得到。
来源:https://blog.csdn.net/GUDUzhongliang/article/details/106897785
猜你喜欢
- 目前很多业务使用微服务架构,服务模块划分有这2种方式:服务功能划分业务划分不管哪种方式,一次接口调用都需要多个服务协同完成,其中一个服务出现
- 公司的老项目要改造多租户,于是进入了大坑,本文写点遇到的坑以及解决方案,每次遇到问题在网上搜了好久,记录下来,防止以后忘掉。(一).方案网上
- 一、前言在Spring中,事务有两种实现方式:编程式事务管理: 编程式事务管理使用TransactionTemplate可实现更细
- mapper文件使用in("str1","str2")mybatis的xxxMapper.xml文件
- 假如是在同一台机器上开发,前后端分离的工程中出现跨域问题的原因是,前端工程和后端工程运行在不同的端口上。只要协议、域名、端口有一个不同就会产
- 重新认识 Java 的 System.in以前也写过不少命令行的程序,处理文件时总需要通过参数指定路径,直到今天看资料时发现了一种我自己从来
- 这篇会深化View拖拽实例,利用Flutter Animation、插值器以及AnimatedBuilder教大家实现带动画的抽屉效果。先来
- 本文实例讲述了C#实现对Json字符串处理方法,分享给大家供大家参考。具体分析如下:一般对于web应用开发人员来说对Json字符串都会很熟悉
- 序言小编在项目中有遇到使用 flutter 实现扫码枪接入的需求。为方便使用,小编把能力封装成 package 并发布。好记性不如烂笔头,下
- FrameLayout 在这个布局中,所有的子元素都不能被指定放置的位置,他们统统防御这块区域的左上角, 并且后面的子元素直接覆盖在前面的子
- Spring JPA 增加字段执行异常用Spring jpa Entity里面增加了几个字段,但启动报错,提示column Unable t
- /** * 进行BigDecimal对象的加减乘除,四舍五入等运算的工具类 * * @author Marydon * @createTi
- 最近做一个需求,需求中的bean只用于生成一次json使用,所以想通过配置来动态的生成,查了一下,java还真有这个实现。java动态的生成
- @Value注解读取yml中的map配置网上查了好多资料,都是.properties文件中读取,而且又是几个人抄来抄去,找了半天功夫不负有心
- 一、实验目的1. 掌握输入输出流的总体结构;2. 掌握流的概念;3. 掌握FileInputStream类、FileOutputStream
- 前言近期一直在忙项目,我也是打工仔。不多说,我们开始玩一玩seata。什么都不说,我们按照惯例,先上一个图(图里不规范的使用请忽略):简单一
- 1、右值1.1 简介首先区分一下左右值:左值是指存储在内存中、有明确存储地址(可取地址)的数据;右值是指可以提供数据值的数据(不可取地址)如
- 过年微信红包很火,最近有个项目也要做抢红包,于是写了个红包的生成算法。红包生成算法的需求预先生成所有的红包还是一个请求随机生成一个红包简单来
- 环境:VS2019+Qt5.121. CLR库安装 &nb
- 详解java.lang.reflect.Modifier.isInterface()方法java.lang.reflect.Modifier