作者:admin,发布日期:2021-08-31
阅读:1461;评论:0

在Spring中,session的数据默认是存储在内存中的。但是在目前分布式应用的趋势下,用户的请求可能被负载分发至不同的服务器,此时由于session是存储在内存中,就会导致各个负载之间无法共享session数据,从而导致无法获取到session,但是我们可以将session存储在其他的数据库中来解决这一问题。

Spring Session提供了用于管理用户会话信息的API和实现,同时还使得支持群集会话变得微不足道,而不依赖于特定于应用程序容器的解决方案。

部署方法

这里我们使用redis来存储用户的session以实现共享session

在pom.xml中加入相应的依赖

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置完成之后,我们需要修改应用的配置文件,配置redis的连接地址以及其他选项

修改application.yml

spring:
  redis:
    host: 127.0.0.1 # 服务器IP
    password: pass # 连接密码
    port: 6739 # 端口

完成之后我们开始编写代码,测试是否可用。

调试测试

在springboot中,我们只需要在application.yml中配置redis的连接信息,剩余部分Spring Boot会交给autoconfigure包下的org.springframework.boot.autoconfigure.session.SessionAutoConfiguration去自动配置相关的bean,我们也可以参考此类自定义相关的bean。

上一步配置完成后,我们开始编写测试controller,在controller中注入HttpSession并增加设置session方法

package com.example.redistest.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/session")
public class HttpSessionController {
    @Resource
    private HttpSession session;

    @RequestMapping("/set")
    public Object setSession() {
        session.setAttribute("test", "fanhua");
        return "true";
    }
}

完成后,我们启动程序,访问页面

http://127.0.0.1:8080/session/set

当页面中输出true时,说明配置正常,此时我们可以使用redis管理工具查看相应的key是否创建。

Snipaste_2021-08-31_15-30-11.png

此时可以发现spring session为我们自动在redis中创建了相关的key,内部存储的是我们session写入的内容。

由于我们注入的Bean为HttpSession,所以其他的操作方式与以往相同,无需进行其他的修改,此时共享session配置完成。