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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:42:43