前言:我们知道,在单体项目中,我们将用户信息存在 session 中,那么在该 session 过期之前,我们都可以从 session 中获取到用户信息,通过登录拦截,进行操作
但是分布式部署的时候,我们请求的服务器可能不是同一台服务器,那么我们就必须要面对 session 共享的问题,下面介绍的是在 SpringBoot 实现 session 共享的方式

一、创建项目

创建 SpringBoot 项目,选择 Maven 依赖


最终 pom.xml 文件如下:

<!-- redis的依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- web的依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- session共享的依赖 -->
<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>
</dependency>

二、配置 Redis

我们需要借助 redis 实现 session 共享,所以我们需要在配置文件中配置 redis 的信息

server:port: 8080spring:redis:host: 127.0.0.1port: 6379database: 0password:

我们配置了该项目的端口,以及 redis 的连接信息

三、写接口

package com.zyxx.session.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpSession;@RestController
public class DemoController {/*** 获取项目端口*/@Value("${server.port}")private String port;/*** 将信息存放在session中*/@GetMapping("set")public String set(HttpSession session) {session.setAttribute("user", "hello world~~~");return port;}/*** 从session中获取信息*/@GetMapping("get")public String get(HttpSession session) {return session.getAttribute("user") + " : " + port;}
}

我们写了一个 set,一个 get 方法,将信息存放在 session 中,从 session 中取出信息

四、打包测试


启动项目,分别启动在两个端口:

java -jar .\session-0.0.1-SNAPSHOT.jar --server.port=8080
java -jar .\session-0.0.1-SNAPSHOT.jar --server.port=8081

分别启动在 8080,8081端口

访问:http://localhost:8080/set

我们从 8080 端口,将信息保存在 session 中

我们访问:http://localhost:8081/get

我们在 8081 端口的项目中从 session 中取出了内容:hello world~~~

由此证明,我们的 session 共享已经成功

五、分布式部署

下面我们借助 nginx 代理转发访问这两个项目

1、配置转发

nginx 配置文件如下:

主要配置内容:

upstream helloworld{server 127.0.0.1:8080 weight=1;server 127.0.0.1:8081 weight=2;
}

这里配置转发到 8080,8081 端口,并配置了权重

location / {proxy_pass http://helloworld;#root   html;#index  index.html index.htm;
}

拦截本地的所有请求,默认端口为 80

2、启动 nginx

nginx -s reload

3、访问测试

我们先删除 redis 里面刚刚测试保存的信息

然后我们访问:

http://localhost/set


这里我们可以看出,由 8080 端口的服务器完成了 set 请求,多次访问,nginx 将会根据什么配置的权重参数分配服务器来完成操作

下面我们访问:

http://localhost/get


可以看出,由 8081 端口的服务器完成了 get 请求,并成功取到了存在 session 中的数据,实现了 session 共享

六、总结

1、以前我们在 SSM 架构的项目中实现 session 共享,需要配置三个地方 ,一个是 web.xml 配置代理过滤器,然后在 Spring 容器中配置 Redis,最后再配置 Spring Session,相比 SpringBoot,稍有复杂
2、我们在 SpringBoot 中实现 session 共享还是非常简单的,只需要引入依赖,简单配置即可实现
3、实现 session 共享,帮助我们将项目分布式部署,提升服务性能有很大的意义

如您在阅读中发现不足,欢迎留言!!!

【SpringBoot】18、SpringBoot中使用Session共享实现分布式部署相关推荐

  1. SpringBoot一个依赖搞定Session共享,没有比这更简单的方案了!

    作者:江南一点雨 微信公众号:牧码小子(ID:a_javaboy) 上一篇:推荐10个你不得不关注的NB技术公众号 有的人可能会觉得题目有点夸张,其实不夸张,题目没有使用任何修辞手法!认真读完本文,你 ...

  2. springboot 2.X jdbc 实现session共享mysql

    POM文件 <!-- 数据库session管理 --><dependency><groupId>org.springframework.session</gr ...

  3. Tomcat 集群中 实现session 共享的三种方法

    前两种均需要使用 memcached 或 redis 存储 session ,最后一种使用 terracotta 服务器共享.  建议使用 redis ,不仅仅因为它可以将缓存的内容持久化,还因为它支 ...

  4. 使用Tomcat-redis-session-manager来实现Tomcat集群部署中的Session共享

    2019独角兽企业重金招聘Python工程师标准>>> 一.工作中因为要使用到Tomcat集群部署,此时就涉及到了Session共享问题,主要有三种解决方案: 1.使用数据库来存储S ...

  5. 在分布式环境中解决session共享问题

    一.什么是session session在计算机中,尤其是在网络应用中,称为"会话控制".Session对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的web页面 ...

  6. Tomcat通过Redis实现session共享的完整部署记录

    对于生产环境有了一定规模的tomcat集群业务来说,要实现session会话共享,比较稳妥的方式就是使用数据库持久化session.为什么要持久化session(共享session)呢?因为在客户端每 ...

  7. java集群session共享_分布式/集群下session共享方案汇总

    1.F5 BIG-IP 硬件实现session粘性复制 F5 硬件,可以作为HTTP负载均衡器使用,可以将用户IP与Session通过F5进行的绑定,使其Session保持一致性.是直接通过智能交换机 ...

  8. memcached实现集群中的session共享存储优缺点

     优点说明: 1. memcached是内存缓存,在读写速度上会比普通files时快很多 2. 可以解决多个服务器公用session的难题 缺点说明: 1. session数据都保存在memory中, ...

  9. 集群中的session共享存储 实现会话保持

    每组web服务器端做一下调整: [root@web03 memcache-2.2.6]# egrep "(session.save_handler|session.save_path)&qu ...

最新文章

  1. 景观格局动态变化分析方法(基于ArcGIS、Fragstats、ENVI、ERDAS、Patch Analysis for ArcGIS) (2011-03-15 08:07:03)...
  2. 石川es6课程---1-2、ES6简介
  3. ajax时间控件,带有ajax的JQuery中的插件datetimepicker出错
  4. C语言 二维数组行数和列数计算 - C语言零基础入门教程
  5. 「源码分析」CopyOnWriteArrayList 中的隐藏知识,你Get了吗?
  6. [uboot]在uboot里面添加环境变量使用run来执行
  7. 实现线程安全的单例模式的四种方式
  8. 搭建oracle运行环境,搭建 Oracle Warehouse Builder 11
  9. python脱离依赖运行py文件_将一个python.py文件拆分为多个相互依赖的文件
  10. US-CERT 公布近三年遭利用频率最高的十大安全漏洞
  11. junit return null该怎么测试_3 分钟生成一个单元测试报告,这个样式爱了
  12. “21天好习惯”第一期-11
  13. ES Search After 分页查询
  14. C语言读取文件输入输出
  15. 层次分析法原理讲解 python手搓实现-故事带入小白详解版
  16. ZXing二维码自定义绘画文字
  17. Windows系统近年漏洞概况及攻击教程防御
  18. shell 脚本生成的文件名出现? 或者^M解决办法
  19. python应用seo_SEO快排技术和应用技术编程大全
  20. 深度学习论文阅读目标检测篇(七)中英对照版:YOLOv4《Optimal Speed and Accuracy of Object Detection》

热门文章

  1. 阅次元小说推荐-最终成品
  2. Angular ngIf ngSwitch ngForOf
  3. 专升本上岸,一切从头开始
  4. Day03| 第四期-阿里巴巴股票行情分析(二)
  5. 【论文阅读】Adap-t: Adaptively Modulating Embedding Magnitude for Recommendation
  6. 【Windows】4:3 显示器分辨率是多少?
  7. socket协议介绍
  8. 波浪 海浪免抠元素素材推荐 精品 小众
  9. TCP/IP RFC如何查询
  10. vue中的插槽(slot)