SpringBoot整合Redis使用x-auth-tonken实现Session共享

news/2024/11/8 6:08:22/

文章目录

  • SpringBoot整合Redis使用x-auth-tonken实现Session共享
    • 1、配置pom.xml文件
    • 2、配置application.properties文件
    • 3、配置启动类
    • 4、验证
      • 4.1、编写一个Controller类
      • 4.2、使用postman发送请求
        • 4.2.1、设置会话信息
        • 4.2.2、获取会话信息
      • 4.3、通过Redis Desktop Manager查看数据
    • 5、使用x-auth-token代替JSESSIONID
      • 5.1、配置HttpSessionStrategy
        • 5.1.1、 1.x版本的SpringBoot
        • 5.1.2、 2.x版本的SpringBoot
        • 5.1.3、 测试验证

SpringBoot整合Redis使用x-auth-tonken实现Session共享

1、配置pom.xml文件

配置pom.xml文件,引入相关的依赖,如下示例:

        <!-- 引入redis,增加springboot使用redis实现session共享 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency>

2、配置application.properties文件

本示例为单节点的redis配置,参考如下:

#指定redis实现spring session
spring.session.store-type=redis
# Session 过期时间,单位s
server.servlet.session.timeout=1800spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=123456
spring.redis.database=1
# 防止冲突,指定namespace,这里为应用名称
spring.session.redis.namespace=${spring.application.name}

3、配置启动类

配置我们应用程序的主启动类,添加@EnableRedisHttpSession注解(注意,这个注解可以不用配置),如下示例:

@SpringBootApplication
@EnableRedisHttpSession
public class DavidRedisSessionApplication {public static void main(String[] args) {SpringApplication.run(DavidRedisSessionApplication.class, args);}}

4、验证

4.1、编写一个Controller类

我们编写一个Controller类,验证session的存储和获取session的内容,如下:

@RestController
@RequestMapping("/test")
public class TestSessionController {@RequestMapping("/set")public Map<String,Object> setSession(HttpSession session, HttpServletRequest request){String name = request.getParameter("name");Map<String,Object> dataMap = new HashMap<>();dataMap.put("serverTime",new Date());session.setAttribute("name",name);return dataMap;}@RequestMapping("/get")public Map<String,Object> getSession(HttpSession session){Map<String,Object> dataMap = new HashMap<>();dataMap.put("serverTime",new Date());dataMap.put("name",session.getAttribute("name"));return dataMap;}}

4.2、使用postman发送请求

我们使用postman分别发送请求,设置会话信息并获取会话信息

4.2.1、设置会话信息

在这里插入图片描述

4.2.2、获取会话信息

在这里插入图片描述

4.3、通过Redis Desktop Manager查看数据

通过Redis Desktop Manager连接到本地的Redis数据库,查看我们刚刚设置的session数据,如下:

在这里插入图片描述

5、使用x-auth-token代替JSESSIONID

一般来说我们不推荐使用x-auth-token来代替JSESSIONID实现会话的共享,因为会存在跨站安全问题,但是接入的端为APP或者小程序时,有些情况需要则使用x-auth-token 进行会话共享。

具体的思路是:

1、第一次请求时,后台自动生成一个ID串,在响应头中以x-auth-token的方式返回给客户端

2、客户端在后续每次调用时,需要在http请求头中加上x-auth-token来标识会话

SpringBoot 1.x版本默认为我们提供了一个HeaderHttpSessionStrategy来实现此功能,代码如下:

public class HeaderHttpSessionStrategy implements HttpSessionStrategy {private String headerName = "x-auth-token";public HeaderHttpSessionStrategy() {}public String getRequestedSessionId(HttpServletRequest request) {return request.getHeader(this.headerName);}public void onNewSession(Session session, HttpServletRequest request, HttpServletResponse response) {response.setHeader(this.headerName, session.getId());}public void onInvalidateSession(HttpServletRequest request, HttpServletResponse response) {response.setHeader(this.headerName, "");}public void setHeaderName(String headerName) {Assert.notNull(headerName, "headerName cannot be null");this.headerName = headerName;}
}

SpringBoot 2.x版本 提供的是HeaderHttpSessionIdResolver实现,代码如下:

package org.springframework.session.web.http;import java.util.Collections;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class HeaderHttpSessionIdResolver implements HttpSessionIdResolver {private static final String HEADER_X_AUTH_TOKEN = "X-Auth-Token";private static final String HEADER_AUTHENTICATION_INFO = "Authentication-Info";private final String headerName;public static HeaderHttpSessionIdResolver xAuthToken() {return new HeaderHttpSessionIdResolver("X-Auth-Token");}public static HeaderHttpSessionIdResolver authenticationInfo() {return new HeaderHttpSessionIdResolver("Authentication-Info");}public HeaderHttpSessionIdResolver(String headerName) {if (headerName == null) {throw new IllegalArgumentException("headerName cannot be null");} else {this.headerName = headerName;}}public List<String> resolveSessionIds(HttpServletRequest request) {String headerValue = request.getHeader(this.headerName);return headerValue != null ? Collections.singletonList(headerValue) : Collections.emptyList();}public void setSessionId(HttpServletRequest request, HttpServletResponse response, String sessionId) {response.setHeader(this.headerName, sessionId);}public void expireSession(HttpServletRequest request, HttpServletResponse response) {response.setHeader(this.headerName, "");}
}

5.1、配置HttpSessionStrategy

我们只需要在启动类或者配置类中,增加如下的配置即可:

5.1.1、 1.x版本的SpringBoot

	@Beanpublic HttpSessionStrategy httpSessionStrategy() {return new HeaderHttpSessionStrategy();}

5.1.2、 2.x版本的SpringBoot

@Bean
public HttpSessionIdResolver httpSessionIdResolver() {return new HeaderHttpSessionIdResolver("x-auth-token");
}

5.1.3、 测试验证

我们用postman进行测试验证,可以看到在第一次设置Session的时候,会在http返回头中多一个字段:x-auth-token,如下:

在这里插入图片描述

我们在获取的时候需要带上,如下:

在这里插入图片描述


http://www.ppmy.cn/news/185366.html

相关文章

echart添加文本_echart在X轴下方添加字

使用Echart做统计图表,这个方便快捷还高大上 按照文档,很快就做出了一个柱图表 在X轴下方,要显示出对应日期是星期几(上图最下方,用红框的部分),这个问题查了很长时间的API,终于找到了一个疑似能解决这个问题的配置项. 这个配置项markLine, 位置在: https://www.echartsjs.com/…

Springboot2.x整合Ehcache3.x(代码方式)

首发传送门&#xff1a;Springboot2.x整合Ehcache3.x Ehcache简介 EhCache 是一个纯Java的进程内缓存框架&#xff0c;具有快速、精干等特点&#xff0c;是Hibernate中默认CacheProvider。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。…

cocos2d-x 编译不同版本VS的项目 检测到_MSC_VER的不匹配项:值1800不匹配值1900(xxxx.obj)

_MSC_VER 是VS编译器的版本 MS VC 14.0 _MSC_VER 1900 vs2015 平台是v140 MS VC 12.0 _MSC_VER 1800 vs2013的编译器 平台是v120 MS VC 11.0 _MSC_VER 1700 vs2012的编译器 平台是v110 MS VC 10.0 _MSC_VER 1600 Visual C 2010 MS VC 9.0 _MSC_VER 1500 Visual C 200…

TMS320C54x硬件结构及原理

TMS320C54x&#xff08;以下简称C54x&#xff09;系列DSP是一种低功耗、高性能的16位定点芯片它的突出特点是&#xff1a;采用改进型哈佛总线结构&#xff0c;具有性能强大的CPU内核、内部多总线结构、硬件重复机制及两套独立的地址产生器&#xff0c;为组成6级流水线和并行操作…

x264 ffmpeg编解码参数笔记

X264 ffmpeg 1、码率&#xff1a; 码流&#xff08;Data Rate&#xff09;&#xff0c;是指视频文件在单位时间内使用的数据流量 三种可选的码率控制方法(bitrate, CQP&#xff0c;CRF), 选择的顺序是 bitrate > QP > CRF QP是固定量化参数&#xff0c;bitrate是固定…

小米AC2100|AX1800/AX3600/cr660x|红米AC2100/AX5/AX6/AX6S固件整理

本帖固件持续更新&#xff0c;请收藏网盘链接&#xff01;&#xff01;内容来自&#xff1a;小米官方固件、恩山论坛中大神编译的固件&#xff01;第三方固件每一款本人都亲测使用过&#xff0c;精挑细选出来的超级好用的版本&#xff01;无任何改动&#xff01;下载前一定要看…

x5675相当于e5_2020年最新桌面CPU性能排行天梯图(含至强处理器)

1 Intel Xeon Platinum 8173M @ 2.00GHz 28860 2 Intel Xeon Gold 6154 @ 3.00GHz 27789 3 Intel Core i9-7980XE @ 2.60GHz 27736 4 Intel Xeon W-2195 @ 2.30GHz 26470 5 Intel Core i9-7960X @ 2.80GHz

2023考研高数接力题典1800习题讲解

第一部分&#xff08;函数、极限、连续&#xff09; 极限求法&#xff1a; ①直接代入数值 ②约去不能代入的零因子 ③分子分母同除最高次幂 ④分子分母有理化 ⑤公式法 ⑥等价无穷小量的代换 ⑦洛必达法则 ⑧换底公式&#xff08;对数&#xff09; P3入门练习填空题讲解&…