本文参考 Spring Boot 一个依赖搞定 session 共享,没有比这更简单的方案了!

在传统的单服务架构中,只有一个服务器,那就不会存在session共享的问题,但如果在分布式/集群项目中,session共享则是一个必须面对的问题。

这样就会出现一个问题,比如说,当客户端发起了一个请求,这个请求到达Nginx之后,被转发到了服务器A,然后在服务器A上往session保存了一份数据,下次又来一个请求,这个请求被转发到 Tomcat B 上,此时再去 Session 中获取数据,发现没有之前的数据。对于这一类问题的解决,思路很简单,就是将各个服务之间需要共享的数据,保存到一个公共的地方(主流方案就是 Redis):

  • 当所有 Tomcat 需要往 Session 中写数据时,都往 Redis 中写,当所有 Tomcat 需要读数据时,都从 Redis 中读。这样,不同的服务就可以使用相同的 Session 数据了。

  • 这样的方案,可以由开发者手动实现,即手动往 Redis 中存储数据,手动从 Redis 中读取数据,相当于使用一些 Redis 客户端工具来实现这样的功能,毫无疑问,手动实现工作量还是蛮大的。

  • 一个简化的方案就是使用 Spring Session 来实现这一功能,Spring Session 就是使用 Spring 中的代理过滤器,将所有的 Session 操作拦截下来,自动的将数据 同步到 Redis 中,或者自动的从 Redis 中读取数据。

  • 对于开发者来说,所有关于 Session 同步的操作都是透明的,开发者使用 Spring Session,一旦配置完成后,具体的用法就像使用一个普通的 Session 一样。

演示

创建一个springboot项目

依赖

       <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!--用于连接redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency> <!--用于使用redis接管session-->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!--工具类,非必需-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.1.0</version>
</dependency>

application.yml

server:
port: 8088
spring:
redis:
host: localhost
port: 6379

IndexController

@RestController
@RequestMapping(value = "/")
public class IndexController { @Value("${server.port}")
private String port;
private String username = "wangxianlin";
private String password = "123456";
private String nickname = "Halo"; @RequestMapping(value = "/login")
public Map<String, Object> getSession(HttpServletRequest request,@RequestParam("user") String user,@RequestParam("pwd") String pwd) {
Map<String, Object> map = new HashMap<>();
if (username.equals(user) && password.equals(pwd)){
request.getSession().setAttribute("user", "当前登录用户是:"+nickname);
map.put("msg", "登录成功");
map.put("port",port);
}else {
map.put("msg", "账号或密码错误");
}
return map;
} @RequestMapping(value = "/get")
public Map<String, Object> get(HttpServletRequest request) {
Map<String, Object> map = new HashMap<>();
String user = (String) request.getSession().getAttribute("user");
map.put("msg", StrUtil.isEmpty(user)?"用户未登录":user);
map.put("port",port);
return map;
}
}

在启动类上加上注解

@EnableRedisHttpSession

将项目打成jar包

启动项目

前提:redis 是否已经开启?

将jar 分别以 8088和8089端口进行启动
java -jar --server.port=8088
java -jar --server.port=8089

配置nginx

 upstream web-server {
server localhost:8088;
server localhost:8089;
} server {
listen 9000;
server_name localhost;
location / {
proxy_pass http://web-server;
}
}

启动nginx

由于我这里有三个nginx配置文件,然后我想启动nginx-origanal.conf 咋办呢?

命令 人家早就给我们安排好了,我们只需要这样。

测试

未登录状态下

http://localhost:9000/get

登录:

http://localhost:9000/login?user=wangxianlin&pwd=123456

http://localhost:9000/get

看一下redis里面

以上内容参考于: Spring Boot 一个依赖搞定 session 共享,没有比这更简单的方案了!

【SpringBoot】Session共享的更多相关文章

  1. 从.Net到Java学习第八篇——SpringBoot实现session共享和国际化

    从.Net到Java学习系列目录 SpringBoot Session共享 修改pom.xml添加依赖 <!--spring session--> <dependency> & ...

  2. 二十三、springboot之session共享

    通过redis实现session共享 SpringBoot集成springsession 1.引入依赖(gradle方式) dependencies { compile('org.springfram ...

  3. springboot+spring session+redis+nginx实现session共享和负载均衡

    环境 centos7. jdk1.8.nginx.redis.springboot 1.5.8.RELEASE session共享 添加spring session和redis依赖 <depen ...

  4. springboot+redis实现session共享

    1.场景描述 因项目访问压力有点大,需要做负载均衡,但是登录使用的是公司统一提供的单点登录系统,需要做session共享,否则假如在A机器登录成功,在B机器上操作就会存在用户未登录情况. 2. 解决方 ...

  5. 基于SpringBoot+Redis的Session共享与单点登录

    title: 基于SpringBoot+Redis的Session共享与单点登录 date: 2019-07-23 02:55:52 categories: 架构 author: mrzhou tag ...

  6. springboot(十八)-session共享

    前言 在传统的单服务架构中,一般来说,只有一个服务器,那么不存在 Session 共享问题,但是在分布式/集群项目中,Session 共享则是一个必须面对的问题,先看一个简单的架构图: 在这样的架构中 ...

  7. 【快学springboot】11.整合redis实现session共享

    前言 这里都是基于前面的项目基础上的.springboot整合redis非常的方便,这也是springboot的宗旨,简化配置.这篇文章就教大家如何使用springboot整合redis来实现sess ...

  8. session共享问题、springboot 版本不统一问题

    问题:按照正常的程序将session 共享引入工程,但是一直取不到 原因:springboot 的版本不同导致,存session的springboot 用的是springboot1.5.6,而取ses ...

  9. springboot集成springsession利用redis来实现session共享

    转:https://www.cnblogs.com/mengmeng89012/p/5519698.html 这次带来的是spring boot + redis 实现session共享的教程. 在sp ...

  10. 【SpringBoot】spring-session-data-redis 解决集群环境下session共享

    为什么会产生Session共享问题   集群情况下,session保存在各自的服务器的tomcat中,当分发地址至不同服务时,导致sesson取不到,就会产生session共享问题. 解决方案 负载均 ...

随机推荐

  1. OctConv:八度卷积复现

    摘要:不同于传统的卷积,八度卷积主要针对图像的高频信号与低频信号. 本文分享自华为云社区<OctConv:八度卷积复现>,作者:李长安 . 论文解读 八度卷积于2019年在论文<Dr ...

  2. 授权普通用户 sudo -i 使其具有root的权限

    1.ssh 秘钥登录授权 将此代码片更名为  adduser.sh 放在linux的 /root 目录下 #!/bin/sh echo 'ssh-key:' $1 echo 'username:' $ ...

  3. 探究公众号接口漏洞:从后台登录口到旁站getshell

    探究公众号接口漏洞:从后台登录口到旁站getshell 1.入口 发现与利用公众号接口安全漏洞 某120公众号提供了一处考核平台,通过浏览器处打开该网站. 打开可以看到一处密码登录口,试了一下常用的手 ...

  4. 【Vue2.x源码系列07】监听器watch原理

    上一章 Vue2计算属性原理,我们介绍了计算属性是如何实现的?计算属性缓存原理?以及洋葱模型是如何应用的? 本章目标 监听器是如何实现的? 监听器选项 - immediate.deep 内部实现 初始 ...

  5. 【ACM算法竞赛日常训练】DAY16【奇♂妙拆分】【区区区间间间】【小AA的数列】数学 | 位运算 | 前缀和

    DAY16共3题: 奇♂妙拆分(简单数学) 区区区间间间(单调栈) 小AA的数列(位运算dp) 作者:Eriktse 简介:19岁,211计算机在读,现役ACM银牌选手力争以通俗易懂的方式讲解算法!️ ...

  6. Rainbond 结合 Jpom 实现云原生 & 本地一体化项目管理

    Jpom 是一个简而轻的低侵入式在线构建.自动部署.日常运维.项目运维监控软件.提供了: 节点管理:集群节点,统一管理多节点的项目,实现快速一键分发项目文件 项目管理:创建.启动.停止.实时查看项目控 ...

  7. ES6中新增的promise异步编程解决方案

    promise异步编程解决方案 第1章 准备 1.1 区别实例对象与函数对象 (1).实例对象:通过    new 函数    产生的对象,称为实例对象,简称对象 (2).函数对象:将函数作为对象使用 ...

  8. WPF 引用字体文件资源

    外部字体文件 1.后台代码引用字体 将一个名为"ChineseCharacterSpecialFont.ttf"的ttf文件,放在桌面路径,后台引用方式如下: 1 var ttfF ...

  9. [OpenCV-Python] 14 几何变换

    文章目录 OpenCV-Python:IV OpenCV中的图像处理 14 几何变换 14.1 扩展缩放 14.2 平移 14.3 旋转 14.4 仿射变换 14.5 透视变换 OpenCV-Pyth ...

  10. Burnside 引理及其扩展

    之前学 Burnside 一直没能深入本质,这回与 QYB 学弟讨论了一下 Burnside 引理的证明,做一个记录. 前置知识:群的定义. 一.等价染色方案计数问题 对于一种染色方案组成的集合 \( ...