Springboot3.2.0使用RequestContextHolder获取HttpServletRequest为NULL

这篇具有很好参考价值的文章主要介绍了Springboot3.2.0使用RequestContextHolder获取HttpServletRequest为NULL。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在之前的版本中一般为了能在任意地方都能获取到HttpServletRequest我们一般都会自己封装工具类从RequestContextHolder中获取到

public static HttpServletRequest getRequest() {
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        assert servletRequestAttributes != null;
        return servletRequestAttributes.getRequest();
    }

但是在新版的SpringBoot3.2.0版本中这种方式获取到的ServletRequestAttributes是null,点击进去RequestContextHolder查看源代码发现少了依赖

springboot3 requestcontextholder,踩坑日记,spring boot

即使我在pom中加入的响应的依赖也还是不行。(可能是我使用方式不对,如果大家有更好的解决方案可以留言我学习学习,谢谢。)

解决方案

实现思路大概就是:自定义一个RequestHolder,然后在过滤器中将HttpServletRequest和HttpServletResponse设置到我们自定义的Holder中

自定义MyRequestHolder

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

/**
 * 自定义请求上下文
 *
 * @author: 张定辉
 * @date: 2023/12/17 15:56
 * @description: 自定义请求上下文
 */
public class MyRequestHolder {
    private  MyRequestHolder(){}

    private static final ThreadLocal<HttpServletRequest> request=new ThreadLocal<>();

    private static final ThreadLocal<HttpServletResponse> response=new ThreadLocal<>();


    public static void setRequest(HttpServletRequest httpServletRequest){
        request.set(httpServletRequest);
    }

    public static void setResponse(HttpServletResponse httpServletResponse){
        response.set(httpServletResponse);
    }

    public static void remove(){
        request.remove();
        response.remove();
    }

    public static HttpServletRequest getRequest(){
        return request.get();
    }

    public static HttpServletResponse getResponse(){
        return response.get();
    }
}
过滤器中设置
/**
 * @author: 张定辉
 * @date: 2023/12/17 11:00
 * @description: 请求体封装拦截器
 */
public class RequestWrapperFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        RequestWrapper requestWrapper=new RequestWrapper(request);
        MyRequestHolder.setRequest(requestWrapper);
        MyRequestHolder.setResponse(response);
        filterChain.doFilter(requestWrapper,response);
        //最后调用remove清除ThreadLocal中的值避免内存泄露
        MyRequestHolder.remove();
    }
}

由于我这里是使用SpringSecurity作为权限验证的,所以我的过滤器也是使用的Security的,最后把这个过滤器加入到Security的过滤器链中即可。如果没使用Security的话则自定义过滤器了添加即可文章来源地址https://www.toymoban.com/news/detail-849633.html

最终使用
public static HttpServletRequest getRequest() {
        return MyRequestHolder.getRequest();
}

到了这里,关于Springboot3.2.0使用RequestContextHolder获取HttpServletRequest为NULL的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot获取HttpServletRequest、HttpServletResponse的三种方式

    仅仅适用在controller方法上。当Spring接收到HTTP请求时,会寻找一个合适的方法来处理该请求。如果该方法参数上标注了@RequestMapping或@Get、@Post等注解,Spring就会将HttpServletRequest对象注入到该参数中。 适用于所有的bean 通过调试可以看到,注入的Reques是一个代理类,而这个被代

    2024年02月19日
    浏览(46)
  • Java21 + SpringBoot3使用Spring Security时如何在子线程中获取到认证信息

    目录 前言 原因分析 解决方案 方案1:手动设置线程中的认证信息 方案2:使用 DelegatingSecurityContextRunnable 创建线程 方案3:修改 Spring Security 安全策略 通过设置JVM参数修改安全策略 通过 SecurityContextHolder 修改安全策略 总结 近日心血来潮想做一个开源项目,目标是做一款可以适

    2024年02月19日
    浏览(37)
  • SpringBoot自定义过滤器获取HttpServletRequest和HttpServletResponse的参数

    公司的老系统改造:由于接口日志不全,接口太多,也无法每个接口都加上日志,所以要在网关层统一记录一下日志,并存到数据库中,(以后计划要存储到ES中) 过滤器是基于Servlet规范的组件,作用于整个请求和响应过程,无法直接访问Spring MVC的上下文。过滤器先于拦截

    2024年01月25日
    浏览(43)
  • 升级springboot3.2.0报Name for argument of type [java.lang.String] not specified, and parameter name inf

    我这里项目版本是jdk17+springboot3.1.5 升级为jdk21和springboot3.2.0;升级过程总体还是挺顺利的,只是访问应用时老报错: Name for argument of type [java.lang.String] not specified, and parameter name information not found in class file either. 这个错误,是因为spring6.1 调整了参数,而springboot会自动帮助设置

    2024年02月04日
    浏览(46)
  • HttpServletRequest和HttpServletResponse的获取与使用

    相关笔记:【JavaWeb之Servlet】 Servlet是JavaWeb的三大组件之一: Servlet Filter 过滤器 Listener 监听器 Servlet是运行在服务器上的一个Java小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。 Servlet接口的实现和继承关系如下,日常开发中直接继承HttpSerlvet类就好: 每次

    2024年02月14日
    浏览(43)
  • 有关使用HttpServletRequest的Cookie的设置和获取

    介绍了如何在HttpServletRequest中对Cookie的进行设置和获取。 在服务器端的HttpServletRequest中对Cookie的进行设置后,客户端在接下来的请求中会携带此设置好的Cookie,所以可以在服务器端接收请求时提取这个Cookie的值。 服务器端设置Cookie值 : 服务器端提取Cookie值 : Stackoverflow:

    2024年02月09日
    浏览(50)
  • RequestContextHolder跨线程获取不到requests请求对象的解决方法

    最近在做一个项目,有个比较耗时的操作是启用线程进行异步操作,当时在启用的线程时,突然发现子线程无法获取父线程中的HttpServletRequest请求对象,因为是第一次遇到这种问题,所以记录一下解决方案。 在这里,我们简单模拟一下出现的问题。我们首先编写一个简单的

    2024年02月13日
    浏览(38)
  • springboot3使用swagger文档

    在pom.xml里面引入如下俩个依赖 然后启动项目,打开浏览器访问 http://localhost:8080/swagger-ui.html 就可以看到生成的文档了  最后附上swagger2到open api的注解变化    

    2024年02月13日
    浏览(48)
  • 【SpringBoot3】使用 devtools 实现代码热部署

    Spring Boot DevTools是一组用于提高开发人员生产力,并加速Spring Boot应用程序开发的工具。它提供了一些功能,可以帮助开发人员更快速地构建应用程序,并减少常见的开发问题。 Spring Boot DevTools的主要作用包括: 自动重新加载 :当应用程序中的代码发生变化时,DevTools会自动

    2024年01月16日
    浏览(37)
  • SpringBoot3.0 整合 ElasticSearch8.5.0 及使用

    这两个版本都是目前较新的版本,本文选用的依赖是 spring-boot-starter-data-elasticsearch:3.0 ,这个新版本也是改用了es的 elasticsearch-java API,全面推荐使用Lambda语法;另外SpringData本身推出了 Repository 功能(有些类似Mybatis-Plus)的功能,也支持注解简化开发。 Docker 快速部署 单机 ela

    2024年02月11日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包