HttpServletRequest 和 HttpServletResponse 不同JDK版本的引入

devtools/2025/3/4 18:08:40/

java中,可能会用到JWT令牌校验,
这时,大概率会用到 HttpServletRequest,和 HttpServletResponse

若为 JDK8SpringBoot 2.7.3 的版本则引入:

java">import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

若是 JDK17, SpringBoot 3.4.0 或更高的版本,则为:

java">import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

我出现这个问题的时候,是从哔哩哔哩上找了个项目,打算学习一下,但视频中用的是JDK8,而我用的JDK17,所以在这里记录一下。

拦截器

java">import cn.hutool.core.util.ObjectUtil;
import com.Jwt工具类.JwtUtil;
import com.ThreadLocal工具类.ThreadLocalUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.common.exception.ServiceException;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;import java.util.Map;/*** 拦截器*/
@RequiredArgsConstructor
@Component //注入到IOC容器里
public class LoginInterceptor implements HandlerInterceptor {private final StringRedisTemplate stringRedisTemplate;//preHandle : 在……之前处理@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {//令牌验证String token = request.getHeader("Authorization");//验证 tokentry {//从redis中获取相同的tokenValueOperations<String, String> operations = stringRedisTemplate.opsForValue();//根据redis键值对的键,获取对应的值String redisToken = operations.get(token);if (ObjectUtil.isNull(redisToken)){//token失效了throw new RuntimeException();}Map<String, Object> map = JwtUtil.paresToken(token);//把业务数据存储到ThreadLocal中ThreadLocalUtil.set(map);//放行return true;} catch (Exception e) {//http响应状态码401response.setStatus(401);//不放行throw new ServiceException("登录状态已失效,请重新登录");}}//afterCompletion 在……之后处理@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {//清空ThreadLocalUtil中的数据,防止内存泄露ThreadLocalUtil.remove();}
}

JWT工具类:

java">import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;import java.util.Date;
import java.util.Map;public class JwtUtil {private static final String KEY = "event";//接受业务数据,生成token并返回public static String genToken(Map<String, Object> claims) {// 创建 JWT 构建器return JWT.create()// 将传入的 claims 放入 token 中,键名为 "claims".withClaim("claims", claims)// 设置过期时间为 当前时间加 3 小时.withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 3))// 使用 HMAC256 算法,并用 "event" 作为密钥进行签名.sign(Algorithm.HMAC256(KEY));}//接受token, 验证token, 并返回业务数据public static Map<String, Object> paresToken(String token) {return JWT.require(Algorithm.HMAC256(KEY)).build().verify(token).getClaim("claims").asMap();}
}

ThreadLocal工具类:

ThreadLocal 用来为每个线程提供独立的变量副本,从而实现线程隔离。使每个线程独立地操作自己的变量副本,而不会影响其他线程的副本。
ThreadLocal 的主要作用是解决多线程环境下共享变量的线程安全问题。它通过为每个线程维护一个独立的变量副本,避免了线程之间的竞争和同步问题。

注意事项

  • 避免滥用:ThreadLocal 适用于线程隔离的场景,但不适合存储大量数据,否则可能会导致内存泄漏。

  • 清理资源:在使用线程池时,务必在任务执行完毕后调用 ThreadLocal.remove(),以防止内存泄漏。

  • 线程池中的问题:如果线程池中的线程被复用,且 ThreadLocal 变量没有被清理,可能会导致数据错乱。

java">public class ThreadLocalUtil {private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();//根据键获取值public static <T> T get(){return (T) THREAD_LOCAL.get();}//存储键值对public static void set(Object value){THREAD_LOCAL.set(value);}//清除ThreadLocal 防止内存泄露public static void remove(){THREAD_LOCAL.remove();}
}

http://www.ppmy.cn/devtools/164523.html

相关文章

【多线程-第三天-NSOperation的练习-tableView异步下载网络图片-沙盒缓存 Objective-C语言】

一、沙盒缓存 1.下边我们来看沙盒缓存,但是,我们先要来看一下,为什么要学这个东西,为什么要做这件事情,好,我们先来运行一下我们的程序, 好,图片,先是从网络上下载, 下载完成之后,就保存到了内存中,保存到我们那个图片的缓存池中来,现在,我把程序关掉,我再开,图…

数据挖掘中特征发现与特征提取的数学原理

好的&#xff0c;我将深入研究数据挖掘中特征发现与特征提取的数学原理&#xff0c;涵盖统计学基础、特征工程的数学方法、以及在机器学习和深度学习中的应用。 我会整理相关数学公式和理论&#xff0c;包括主成分分析&#xff08;PCA&#xff09;、独立成分分析&#xff08;I…

【Kubernets】K8S亲和性配置相关说明

K8S亲和性配置相关说明 配置说明**Kubernetes 亲和性配置详细说明** **一、亲和性类型****二、节点亲和性&#xff08;Node Affinity&#xff09;****1. 硬策略&#xff1a;requiredDuringSchedulingIgnoredDuringExecution****2. 软策略&#xff1a;preferredDuringScheduling…

如何通过rust实现自己的web登录图片验证码

在进行web系统开发时&#xff0c;为保障系统登录安全&#xff0c;登录页面中的验证码必不可少。在java中&#xff0c;我们可以利用相应的2D图像库快速生成图形验证码&#xff0c;而对于rust&#xff0c;我们没有合适的标准库进行图像验证码的生成。今天&#xff0c;我们通过使用…

nuxt常用组件库html-validator、@nuxtjs/i18n、@nuxt/image、@unocss/nuxt使用解析

html-validator 主要用于自动验证nuxt服务器呈现的HTML(SSR和SSG)&#xff0c;以检测可能导致水合错误的HTML常见问题&#xff0c;有助于减少水合错误&#xff0c;检测常见的可访问性错误。 安装 npx nuxilatest module add html-validator配置 若自动更新nuxt.config.ts配置文…

如何使用Spring Boot框架整合Redis:超详细案例教程

目录 # 为什么选择Spring Boot与Redis整合&#xff1f; 1. 更新 pom.xml 2. 配置application.yml 3. 创建 Redis 配置类 4. Redis 操作类 5. 创建控制器 6. 启动应用程序 7. 测试 # 为什么选择Spring Boot与Redis整合&#xff1f; 将Spring Boot与Redis整合可以充分利…

WPF创建DeepSeek本地自己的客户端-进阶版

本次文章接上次写的“基础版”继续 WPF快速创建DeepSeek本地自己的客户端-基础思路版本 1 开发环境与工具 开发工具&#xff1a;VS 2015 开发环境&#xff1a;.Net 4.0 使用技术&#xff1a;WPF 本章内容&#xff1a;WPF实现一个进阶版的DeepSeek客户端。 效果图如下&#x…

【入门Web安全之前端学习的侧重点和针对性的建议】

入门Web安全之前端学习的侧重点和针对性的建议 一、HTML&#xff1a;理解攻击载荷的载体二、CSS&#xff1a;次要但需警惕点击劫持三、JavaScript&#xff1a;渗透测试的核心重点四、浏览器工具&#xff1a;渗透测试的实战武器五、学习建议与资源六、总结&#xff1a;渗透测试者…