Spring Session将HttpSession保存到Redis中,实现重启应用会话不丢失

这篇文章介绍一下在springboot项目中整合Spring Session,将session会话信息保存到Redis中,防止重启应用导致会话丢失。

第一步

创建一个springboot项目,添加spring-session-redis的依赖,因为要用到reids,所以要把redis相关依赖也加进来。

XML 复制代码
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <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>
    </dependencies>

第二步

在spplication.yml中配置命名空间和redis的连接信息。

XML 复制代码
spring:
  session:
    redis:
      save-mode: on_set_attribute
      namespace: spring:session
  redis:
    host: localhost
    port: 6379
    database: 0
    password: mhxy1218

第三步

在启动类上添加@EnableRedisHttpSession注解。

第四步

在项目中使用HttpSession,创建一个控制器类,然后添加两个接口分别用于设置和获取session。

java 复制代码
package cn.edu.sgu.www.session.controller;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Enumeration;

/**
 * @author heyunlin
 * @version 1.0
 */
@RestController
@RequestMapping("/session")
public class SessionController {

    @GetMapping("/getSession")
    public String getSession(HttpSession session, HttpServletRequest request) {
        Object name = session.getAttribute("name");

        // 查看请求头
        Enumeration<String> headerNames = request.getHeaderNames();

        while (headerNames.hasMoreElements()) {
            String element = headerNames.nextElement();

            System.out.println(element);
        }

        return name.toString();
    }

    @GetMapping("/setSession")
    public void setSession(HttpSession session, String name) {
        session.setAttribute("name", name);
    }

}

第四步

启动项目,在浏览器输入以下网址,设置name为沐雨橙风ιε

java 复制代码
http://localhost:8080/session/setSession?name=%E6%B2%90%E9%9B%A8%E6%A9%99%E9%A3%8E%CE%B9%CE%B5

然后,再访问获取session的接口

java 复制代码
http://localhost:8080/session/getSession

第五步

查看浏览器cookie,按F12打开浏览器控制台,点击网络查看刚刚发起的请求携带的cookile数据。

把这长串字符串复制出来

第六步

清空浏览器,访问获取session数据的接口。

这时候发现已经获取不到了,这是因为清理缓存会把浏览器的cookie数据删除,所以请求时没有携带cookile请求头。

第七步

通过postman访问/session/getSession,携带请求头cookie,其内容为

复制代码
SESSION=ZDcyNGFlNzgtYzUyYS00NGFjLTkwYzgtMzRiYWNjNjE1Y2Y0

第八步

重启项目,然后再获取session,这时候数据还在~

好了,文章就分享到这里了,代码已经上传到gitee~

spring boot整合spring-session-redis案例项目https://gitee.com/muyu-chengfeng/spring-session-redis.git

相关推荐
时间的拾荒人3 分钟前
Redis 哨兵(Sentinel)详解:原理、选举机制与实战部署
redis·面试·架构·sentinel
黄连木笛4 分钟前
Redis Insight 汉化教程:Windows / macOS / Linux 设置中文界面(附繁體、教程汉化、关闭自动更新)
数据库·redis·缓存
say_fall18 分钟前
【Linux网络编程】UDP套接字编程:系统编程组件、基础回显服务、InetAddr与地址转换、翻译服务与线程池聊天室
linux·服务器·网络·udp·vr
无奈笑天下10 小时前
银河麒麟上nproc命令教程详解
linux·运维·服务器
时间的拾荒人13 小时前
Redis 主从复制详解:配置实操 + 原理机制
数据库·redis·面试
火云代理13 小时前
更换网络后为什么会退出登录?分清 IP、Cookie 与会话的关系
服务器·网络·网络协议·tcp/ip·php·ip
威嵌神州14 小时前
嵌入式排故实录:高并发下串口数据“超时丢包”的根因剖析与架构优化
运维·服务器·嵌入式硬件·缓存
budingxiaomoli14 小时前
Spring统一功能处理
java·后端·spring
火云代理17 小时前
同一个网站,有的网络能打开、有的打不开?认识 IPv4 与 IPv6 的访问差异
服务器·网络·网络协议·tcp/ip·测试工具·php·状态模式
坤坤子吖17 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习