Spring Boot中能否覆盖HttpServletRequest请求头,默认设置Content-Type?
给HttpServletRequest默认添加Content-Type请求头的实现方案
完全可行,核心思路是通过包装HttpServletRequest重写请求头的获取逻辑——因为原生HttpServletRequest的请求头是只读的,无法直接修改,只能通过包装类拦截头的获取操作,在未检测到Content-Type时返回默认值。
具体实现步骤
1. 自定义HttpServletRequest包装类
public class CustomRequestWrapper extends HttpServletRequestWrapper { public CustomRequestWrapper(HttpServletRequest request) { super(request); } @Override public String getHeader(String name) { String header = super.getHeader(name); // 当Content-Type为空时返回默认值application/json if ("Content-Type".equalsIgnoreCase(name) && header == null) { return "application/json"; } return header; } // 重写getHeaders方法,确保批量获取头时逻辑一致 @Override public Enumeration<String> getHeaders(String name) { if ("Content-Type".equalsIgnoreCase(name)) { return Collections.enumeration(Collections.singletonList(getHeader(name))); } return super.getHeaders(name); } // 重写getHeaderNames,确保Content-Type被纳入头名称列表 @Override public Enumeration<String> getHeaderNames() { Set<String> headerNames = Collections.list(super.getHeaderNames()); headerNames.add("Content-Type"); return Collections.enumeration(headerNames); } }
2. 自定义Filter应用包装类
public class ContentTypeFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; CustomRequestWrapper wrappedRequest = new CustomRequestWrapper(httpRequest); chain.doFilter(wrappedRequest, response); } @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void destroy() {} }
3. 配置Filter(以Spring Boot为例)
@Configuration public class FilterConfig { @Bean public FilterRegistrationBean<ContentTypeFilter> contentTypeFilter() { FilterRegistrationBean<ContentTypeFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new ContentTypeFilter()); // 拦截所有请求路径,可根据需求调整 registrationBean.addUrlPatterns("/**"); return registrationBean; } }
注意事项
- 确保应用中依赖Content-Type的组件(如Spring消息转换器)是通过
getHeader("Content-Type")方法获取值的,这样才能触发包装类的默认值逻辑。 - 如果是传统Web项目,可通过web.xml配置Filter,替代上述Spring Boot的注解配置方式。
内容的提问来源于stack exchange,提问作者Carry Flag
相关产品推荐
相关产品推荐

