如何在HandlerInterceptor中修改HttpServletRequest的header值
问题核心原因
你编写的HttpServletRequestWrapper没有生效的根本原因是:你仅创建了包装类实例,但没有替换后续请求处理流程中实际使用的HttpServletRequest对象。Spring MVC的拦截器执行时,DispatcherServlet已经持有了原生请求对象,后续参数解析、控制器调用都会使用这个原生对象,你单独创建的包装类不会被用到,所以重写的方法不会触发。
推荐解决方式
方案一:使用Filter(最规范,兼容性最好)
你不需要担心Filter处理所有请求,可通过路径匹配或控制器判断精准控制仅作用于目标接口,不会额外影响其他请求:
- 你已经实现的
RequestHeaderOverwriteWrapper可以直接复用 - 新增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
相关产品推荐
相关产品推荐

