如何修改HttpServletRequest的Headers?

简介: HttpServletRequest java

今天遇到一个问题,记录如下

需求: 需要对request的请求添加一个Header,发现没有提供新增/修改Header的方法

进入 HttpServletRequest 的源码查看,由于HttpServletRequest是一个接口,需要找到对应的实现类,才能看有没有对应的接口,进入debug查看httpServletRequest的实现类

测试代码如下:


测试结果如下:



经过测试发现实现类为

org.apache.catalina.connector.RequestFacade

而这只是一个包装类,他的内部还有一个Request对象

进入该类

org.apache.catalina.connector.Request

发现内部仍然有一个对象:

org.apache.coyote.Request

也可以通过上图的debug结果查看

org.apache.coyote.Request提供了addValue方法来修改headers属性.

经过测试可以使用反射来修改header

@GetMappingpublicvoidtestServletRequest(HttpServletRequestrequest, HttpServletResponseresponse) throwsIOException, NoSuchFieldException, InstantiationException, IllegalAccessException, ServletException {
RequestFacaderequestFacade= (RequestFacade) request;
// 反射获取request属性Fieldrequest1=requestFacade.getClass().getDeclaredField("request");
// 设置私有属性权限request1.setAccessible(true);
Objecto=request1.get(request);
// 获取coyoteRequestFieldcoyoteRequest=o.getClass().getDeclaredField("coyoteRequest");
coyoteRequest.setAccessible(true);
Objecto1=coyoteRequest.get(o);
Fieldheaders=o1.getClass().getDeclaredField("headers");
headers.setAccessible(true);
// 获取HeaderMimeHeaderso2= (MimeHeaders)headers.get(o1);
o2.addValue("Auth").setString("123");
request.getRequestDispatcher("/servletRequest/test").forward(request,response);
        }

参考文章: https://blog.csdn.net/u010698072/article/details/79973830

目录
相关文章
|
NoSQL 算法 Java
面试官:网关如何实现限流?
面试官:网关如何实现限流?
1746 2
面试官:网关如何实现限流?
|
JSON Java 应用服务中间件
HttpServletRequest核心方法以及获取请求参数
HttpServletRequest核心方法以及获取请求参数
3551 0
|
安全 Java Spring
Spring Boot 过滤器(Filter)详解
本文详解Spring Boot中过滤器的原理与实践,涵盖Filter接口、执行流程、@Component与FilterRegistrationBean两种实现方式、执行顺序控制及典型应用场景如日志记录、权限验证。对比拦截器,突出其在Servlet容器层的通用性与灵活性,助力构建高效稳定的Web应用。
6227 1
|
机器学习/深度学习 XML Java
【spring boot logback】日志logback格式解析
在 Spring Boot 中,Logback 是默认的日志框架,它支持灵活的日志格式配置。通过配置 logback.xml 文件,可以定义日志的输出格式、日志级别、日志文件路径等。
2089 5
|
自然语言处理 JavaScript Java
Spring 实现 3 种异步流式接口,干掉接口超时烦恼
本文介绍了处理耗时接口的几种异步流式技术,包括 `ResponseBodyEmitter`、`SseEmitter` 和 `StreamingResponseBody`。这些工具可在执行耗时操作时不断向客户端响应处理结果,提升用户体验和系统性能。`ResponseBodyEmitter` 适用于动态生成内容场景,如文件上传进度;`SseEmitter` 用于实时消息推送,如状态更新;`StreamingResponseBody` 则适合大数据量传输,避免内存溢出。文中提供了具体示例和 GitHub 地址,帮助读者更好地理解和应用这些技术。
3060 122
|
存储 JSON Java
对HttpServletRequest中的Header进行增删
本文介绍了如何通过反射操作Servlet容器中的请求头,弥补`HttpServletRequest`接口未提供修改或删除功能的不足。以Tomcat和Undertow为例,展示了如何在Filter中对请求头进行增删操作,如添加`x-request-id`和移除`User-Agent`等。适用于需要统一处理请求头的场景。[详细步骤及代码示例](https://forum.springdoc.cn/t/topic/3643)。
对HttpServletRequest中的Header进行增删
|
SQL 缓存 Java
mybatis 一对多查询
mybatis 一对多查询
602 0
|
前端开发 安全 JavaScript
SpringBoot 如何解决跨域问题?
本文深入探讨了Spring Boot解决跨域问题的方法,包括全局配置CORS、使用@CrossOrigin注解和自定义过滤器,提供了详细的代码示例和分析,帮助开发者有效应对Web开发中的跨域挑战。
2365 4
|
XML Java 数据库连接
Myatis 系列之 一对多、多对一 及 ResultMap的使用
文章详细介绍了Mybatis中使用`resultMap`处理数据库表字段名和实体类属性名不一致问题,以及实现一对多和多对一关系映射的方法,并提供了相应的XML配置和测试用例。
Myatis 系列之 一对多、多对一 及 ResultMap的使用