首页 > 其他分享 >【SpringBoot】Session共享

【SpringBoot】Session共享

时间:2023-02-13 09:44:47浏览次数:57  
标签:map SpringBoot server Session user 共享 port String

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

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

image.png

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

image.png

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

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

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

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

演示

创建一个springboot项目

image.png

依赖

       <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包

image.png

启动项目

前提:redis 是否已经开启?

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

8088

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 咋办呢?
image.png

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

image.png

测试

未登录状态下

http://localhost:9000/get

image.png

image.png

登录:

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

image.png

http://localhost:9000/get

image.png

image.png

看一下redis里面

image.png

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

标签:map,SpringBoot,server,Session,user,共享,port,String
From: https://www.cnblogs.com/HelloWxl/p/17115344.html

相关文章

  • Cookie 和 Session 区别
    Cookie保存客户的数据,服务器产生发回客户端Cookie数据保存客户端,不安全Cookie数据限制64KBCookie保存SessionID值Session数据存储服务器相对Cookie安全不限制类......
  • SpringBoot项目启动后再请求远程接口的实现方式
    场景有一个SpringBoot项目需要在启动后请求另一个远程服务拿取配置,而不是加载过程中去请求,可能会出现类没有实例化的场景,因此需要实现项目完全启动后再进行请求的场景......
  • 09 Cookie与Session组件
    Cookie与Session组件cookie与sessionCookie的由来HTTP协议是无状态的状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就是这些数据不会被保留。会话中......
  • Springboot项目配置SSL问题
    项目写一半想发布看一眼,是微信小程序的项目,一切都准备好了结果没有发布成功。第一次发布小程序,才知道微信小程序必须要https协议的域名才可以。发布小程序大致流程编......
  • springboot内置的数据源,持久化技术和数据库管理工具
    我们之前用的是Druid,mybatis,mysql:   现在看看springboot内置的数据源:   内置的持久化技术jdbcTemplate:   使用这个jdbcTemplate需要导入jar包:  ......
  • 如何理解SpringBoot中的Starter
    starter可以使我们少定义一些配置比如我们使用spring+springMvc进行开发时,如果需要引入mybatis等框架,还需要再去xml中定义mybatis需要的bean。使用starter可以让我们开箱......
  • Spring、SpringMVC、SpringBoot有什么区别
    Spring是一个IOC容器,用来存放管理Bean,使用依赖注入实现控制反转。也是一个桥梁,可以很方便地整合各种框架。还提供了AOP机制,弥补了OOP的代码重复问题,更方便将不同类不同方法......
  • springboot 多数据源 实例(sybase、mysql数据库)(下)
    接下来见证奇迹的时刻:首先要借鉴yandype这位大神的总结的代码:说明:springboot2.3.x+mybatisplus+ druid +sybase+mysql多数据源整合1、项目依赖<?xmlvers......
  • springboot 多数据源 实例(sybase、mysql数据库)(上)
    最近项目需要用到sybase(sqlanywhere)、mysql数据库两边数据交互。由于之前对sybase数据库一点不懂踩了许多坑特意记下:连接sybase客户端需要用到 SQLCentral1......
  • SpringBoot 时间格式化的 5 种实现方法!
    在我们日常工作中,时间格式化是一件经常遇到的事儿,所以本文我们就来盘点一下SpringBoot中时间格式化的几种方法。时间问题演示为了方便演示,我写了一个简单SpringBoot......