You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在HandlerInterceptor中修改HttpServletRequest的header值

问题核心原因

你编写的HttpServletRequestWrapper没有生效的根本原因是:你仅创建了包装类实例,但没有替换后续请求处理流程中实际使用的HttpServletRequest对象。Spring MVC的拦截器执行时,DispatcherServlet已经持有了原生请求对象,后续参数解析、控制器调用都会使用这个原生对象,你单独创建的包装类不会被用到,所以重写的方法不会触发。

推荐解决方式

方案一:使用Filter(最规范,兼容性最好)

你不需要担心Filter处理所有请求,可通过路径匹配或控制器判断精准控制仅作用于目标接口,不会额外影响其他请求:

  1. 你已经实现的RequestHeaderOverwriteWrapper可以直接复用
  2. 新增Filter实现类,代码如下:
@Component
public class HeaderOverwriteFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        // 仅处理你目标控制器对应的路径,按需修改匹配规则即可
        if (httpRequest.getRequestURI().startsWith("/你的目标路径前缀/")) {
            // 构造包装类替换原生请求
            RequestHeaderOverwriteWrapper wrapper = new RequestHeaderOverwriteWrapper(httpRequest, "你要设置的Header新值");
            chain.doFilter(wrapper, response);
            return;
        }
        // 其他请求直接用原生对象放行
        chain.doFilter(request, response);
    }
}

方案二:坚持用拦截器的变通方案

如果确实不想使用Filter,可以通过反射直接修改Servlet容器原生Request对象的Header存储结构,不需要用到Wrapper,拦截器preHandle代码如下:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    // 仅处理目标控制器的请求,过滤静态资源等其他请求
    if (!(handler instanceof HandlerMethod handlerMethod)) {
        return true;
    }
    // 按需修改为你要匹配的控制器类
    if (!handlerMethod.getBeanType().equals(你的目标控制器类.class)) {
        return true;
    }

    // 以下为Tomcat容器的反射修改逻辑,使用其他容器需对应调整类、字段名
    if (request instanceof org.apache.catalina.connector.RequestFacade) {
        Field requestField = org.apache.catalina.connector.RequestFacade.class.getDeclaredField("request");
        requestField.setAccessible(true);
        org.apache.catalina.connector.Request catalinaRequest = (org.apache.catalina.connector.Request) requestField.get(request);
        org.apache.tomcat.util.http.MimeHeaders mimeHeaders = catalinaRequest.getCoyoteRequest().getMimeHeaders();
        // 覆盖指定Header的值,不存在会自动新增
        mimeHeaders.setValue("Header-To-Change").setString("你要设置的Header新值");
    }
    return true;
}

注意:该方案依赖Servlet容器的内部实现,跨容器部署需要调整代码,兼容性弱于方案一。

内容的提问来源于stack exchange,提问作者Lvsia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 02:06:05