preHandle 添加参数和重写参数的问题,重写HttpServletRequestWrapper和Filter

在preHandle中因HttpServletRequest缺乏直接添加参数的方法,故需通过重写HttpServletRequestWrapper来实现。本文介绍如何创建ChangeRequestWrapper类并扩展HttpServletRequestWrapper,同时展示了如何在Filter中进行重写,并在web.xml中配置拦截器。文中分享了解决问题的过程,并提醒配置的拦截器会先于preHandle执行。博客内容源于他人,旨在学习交流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于 preHandle 中HttpServletRequest 只有setAttribute而没有setParameter 也没有 add 方法

所以是没办法直接添加参数的。从网上查了很多资料,基本都是说要重写HttpServletRequestWrapper

说干就干,通过网上查博客看看别人的实现方式,可能因为自己底子不够扎实吧,很多都看不懂,摸索了

一天总算是弄出来了。现在记录一下,方便以后查阅。

 

首先,创建一个ChangeRequestWrapper 类继承HttpServletRequestWrapper,代码如下

package com.ccs.ssmis.common.interceptors;

import com.ccs.ssmis.common.redis.RedisUtils;
import com.ccs.ssmis.common.utils.Constants;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;

public class ChangeRequestWrapper extends HttpServletRequestWrapper {

    private Map<String, String[]> parameterMap; // 所有参数的Map集合

    public ChangeRequestWrapper(HttpServletRequest request) {
        super(request);
        parameterMa
<think>嗯,用户现在的问题是在Spring的application.xml添加请求头参数,并且提到与removeRequestHeader相对应的操作。首先,我需要回顾一下之前的历史对话。用户之前询问了如何在application.xml添加Header,我提供了过滤器Spring Boot的配置方法。现在用户进一步提问,想了解如何添加请求头参数,特别是对应removeRequestHeader的操作。 首先,我需要明确用户的具体需求。他们可能是在处理HTTP请求时,想要在请求到达控制器之前添加一些自定义的请求头,或者修改现有的请求头。而removeRequestHeader通常是在拦截器或过滤器中移除某个请求头,所以对应的操作应该是添加或设置请求头。 接下来,我需要回忆Spring框架中处理请求头的机制。在传统的Spring MVC项目中,配置通常通过XML完成。要添加请求头,可以使用过滤器或者拦截器。用户提到application.xml,所以应该考虑XML配置方式。 在之前的回答中,我提到了如何通过自定义过滤器来设置响应头,但用户现在需要的是请求头。因此,可能需要使用装饰器模式来包装HttpServletRequest,覆盖getHeader方法或者添加新的头。例如,使用HttpServletRequestWrapper来扩展请求对象,然后在过滤器中传递这个包装后的对象。 然后,用户提到了removeRequestHeader,这可能是指Apache Camel中的组件,或者Spring Integration中的某些功能,但更可能是指他们在某个上下文中看到过类似的操作,比如在拦截器中移除请求头。对应的添加操作应该是添加或修改请求头。 需要确保在XML配置中正确声明过滤器相关的Bean。例如,创建自定义的过滤器类,使用DelegatingFilterProxy来代理,并在过滤器中修改请求头。同时,要考虑到请求头在转发过程中的传递,可能需要使用RequestContextHolder来获取当前请求,但这在过滤器中可能不太直接。 另外,用户引用的内容提到了跨域请求自定义头,比如X-PINGOTHER,这可能涉及到CORS配置。但用户的问题更偏向于如何添加请求头,而不是处理跨域。不过需要确认是否在CORS配置中也需要允许这些自定义头。 还要注意,在传统的Spring XML配置中,处理请求头的添加可能需要通过拦截器(HandlerInterceptor)来实现,在preHandle方法中修改请求头。或者使用Spring的ClientHttpRequestInterceptor,但这更多用于客户端发起的请求,比如RestTemplate。 综合来看,正确的做法应该是创建一个过滤器,包装HttpServletRequest添加所需的请求头,然后在application.xml中配置这个过滤器。同时,要确保过滤器的顺序正确,以便在请求处理的早期阶段修改请求头。 需要验证这种方法的可行性,比如编写一个自定义过滤器,使用HttpServletRequestWrapper添加头,然后在控制器中测试是否能获取到这些头。同时,要考虑到安全性,确保添加的请求头不会引发安全问题,比如注入攻击等。 可能还需要考虑与其他组件的兼容性,比如是否会影响现有的过滤器链,或者是否需要在特定位置插入这个过滤器。此外,用户提到的removeRequestHeader可能是指类似的功能,但方向相反,所以需要明确添加移除在配置上的不同之处。 最后,总结步骤:创建自定义过滤器,包装请求对象,添加头;在application.xml中配置该过滤器;测试验证。同时,提供相关的代码示例配置片段,确保用户能够正确实施。</think>在Spring框架中,`application.xml`配置请求头参数的操作与`removeRequestHeader`相反,需要通过**过滤器(Filter)**或**拦截器(Interceptor)**实现请求头的添加。以下是具体实现方法及对应操作逻辑: --- ### 一、添加请求头参数的核心原理 1. **与`removeRequestHeader`的对应关系** - `removeRequestHeader`(如Spring Integration中的操作)用于移除请求头 - 添加请求头需通过**包装`HttpServletRequest`**,重写`getHeader`方法实现动态添加 2. **实现方式** 使用`HttpServletRequestWrapper`扩展原生请求对象,覆盖头信息获取方法。 --- ### 二、XML配置实现步骤 #### 1. 创建请求头包装器 ```java public class CustomRequestWrapper extends HttpServletRequestWrapper { private final Map<String, String> customHeaders; public CustomRequestWrapper(HttpServletRequest request) { super(request); this.customHeaders = new HashMap<>(); // 添加自定义请求头 customHeaders.put("X-Custom-Header", "value123"); customHeaders.put("Authorization", "Bearer token456"); } @Override public String getHeader(String name) { return customHeaders.containsKey(name) ? customHeaders.get(name) : super.getHeader(name); } } ``` #### 2. 创建过滤器实现请求头注入 ```java public class AddHeaderFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; // 包装原始请求 HttpServletRequest wrappedRequest = new CustomRequestWrapper(request); chain.doFilter(wrappedRequest, res); } } ``` #### 3. 在`application.xml`中配置过滤器 ```xml <!-- 注册过滤器Bean --> <bean id="addHeaderFilter" class="com.example.filter.AddHeaderFilter"/> <!-- 配置过滤器链 --> <filter> <filter-name>addHeaderFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetBeanName</param-name> <param-value>addHeaderFilter</param-value> </init-param> </filter> <filter-mapping> <filter-name>addHeaderFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` --- ### 三、操作验证与注意事项 1. **验证方式** 在控制器中通过`@RequestHeader`注解获取添加的请求头: ```java @GetMapping("/test") public ResponseEntity<String> testHeader( @RequestHeader("X-Custom-Header") String customHeader) { return ResponseEntity.ok("Received header: " + customHeader); } ``` 2. **关键点** - 过滤器需在所有其他处理逻辑**之前**执行 - 若需动态修改请求头(如根据请求内容生成),可在`CustomRequestWrapper`中实现更复杂的逻辑 - 避免与安全框架(如Spring Security)的过滤器链冲突[^1] --- ### 四、与`removeRequestHeader`的对比 | 操作类型 | 实现方式 | 典型场景 | |------------------|-------------------------------------|--------------------------| | **添加请求头** | `HttpServletRequestWrapper`包装请求 | 注入认证令牌、版本标识等 | | **移除请求头** | `HeaderFilter`拦截并删除指定头 | 防止敏感信息透传[^2] | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值