springboot拦截器无法获取token值的问题

探讨前后端分离项目中,SpringBoot后端拦截器无法正确获取前端请求头中的Token值问题。分析原因在于浏览器预检请求未被妥善处理,提出解决方案确保预检请求通过,正常获取Token。

springboot拦截器无法获取token值的问题

问题描述

前后端分离项目使用token进行登录及接口校验,出现在后端拦截器中无法获取前端请求头中的token值,导致所有前端请求校验无法通过

导致该问题的原因

浏览器在发送请求时会默认先发送一次类型为’option’且不带任何参数的请求,请求成功后才会发送真正的Post或者get请求,简单说明一下什么是option请求:

跨域请求中,options请求是浏览器自发起的preflight request(预检请求),以检测实际请求是否可以被浏览器接受。
	preflight request请求报文中有两个需要关注的首部字段:
	(1)Access-Control-Request-Method:告知服务器实际请求所使用的HTTP方法;
	(2)Access-Control-Request-Headers:告知服务器实际请求所携带的自定义首部字段。

而在后台拦截器中通常只处理了post或者get类型的请求,而没有对option类型的请求做处理,因此前端发送的预检请求无法通过后端的拦截器,导致真正的Post(get)请求无法发送

解决办法

后端拦截器添加处理option类型的请求的方法,保证预检请求通过后则可以正常的获取前端请求头中的token值

### 解决方案 在 Spring Boot 中通过拦截器解析 Token 并将解析后的信息存入请求上下文中,可以按照如下方式实现: #### 定义拦截器类并实现 `HandlerInterceptor` 接口 创建一个新的 Java 类来作为自定义拦截器,并让其继承 `HandlerInterceptor` 接口。此接口提供了三个主要方法用于处理请求的不同阶段。 ```java package com.example.demo.interceptor; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Component public class JwtTokenInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String headerAuth = request.getHeader("Authorization"); if (headerAuth != null && headerAuth.startsWith("Bearer ")) { try { // 去除 "Bearer " 前缀 String jwtToken = headerAuth.substring(7); // 进行 JWT 的验证与解析逻辑 // 将解析的信息设置到当前线程局部变量中以便后续访问控制或其他业务逻辑使用 SecurityContextHolder.getContext().setAuthentication(/* 构建好的认证对象 */); return true; // 继续执行下一个处理器或视图渲染过程 } catch (Exception e) { logger.error("Failed to process the token", e); throw new RuntimeException("Invalid or expired token."); } } throw new RuntimeException("Missing Authorization Header."); } } ``` 为了确保能够正确获取到 Redis 工具实例化对象而不是返回为空的情况,在声明依赖时应考虑组件扫描路径以及 Bean 初始化顺序等问题[^1]。 另外需要注意的是,如果希望在整个应用范围内都能生效,则还需要注册这个新的拦截器至全局配置文件内[^4]。 最后一步是在启动类或者其他合适的地方完成对上述自定义拦截器的加载工作,通常可以通过重写 `WebMvcConfigurer` 来达到目的。 ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private JwtTokenInterceptor jwtTokenInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(jwtTokenInterceptor).addPathPatterns("/api/**"); // 只针对 API 请求启用该拦截器 } } ``` 这样就完成了整个流程的设计与编码工作,实现了基于 Spring Boot 框架下的 Token 验证机制,并且成功地把解析出来的用户身份信息保存到了 HTTP 请求的作用域里供其他地方调用[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值