如何配置 spring 以忽略无效的 Accept 标头?

Voi*_*ain 5 java spring http spring-mvc http-accept-header

我正在使用 spring 来构建我的网络应用程序。

在我的自定义WebMvcConfigurationSupport类中,我设置基本ContentNegotiationConfigurer如下:

@Override
public void configureContentNegotiation(final ContentNegotiationConfigurer configurer) {
    configurer
            .favorPathExtension(false)
            .favorParameter(true)
            .parameterName("mediaType")
            .ignoreAcceptHeader(false)
            .useJaf(false)
            .defaultContentType(MediaType.APPLICATION_XML)
            .mediaType("json", MediaType.APPLICATION_JSON)
            .mediaType("xml", MediaType.APPLICATION_XML);
}
Run Code Online (Sandbox Code Playgroud)

我无法设置ignoreAcceptHeadertrue,因为我的一些客户依赖此标头进行响应。

但是,当我尝试使用无效Accept标头Accept: :*/*(请注意,额外的冒号)访问我的 API 时,spring 会重定向到错误页面/error,并显示以下日志:

@Override
public void configureContentNegotiation(final ContentNegotiationConfigurer configurer) {
    configurer
            .favorPathExtension(false)
            .favorParameter(true)
            .parameterName("mediaType")
            .ignoreAcceptHeader(false)
            .useJaf(false)
            .defaultContentType(MediaType.APPLICATION_XML)
            .mediaType("json", MediaType.APPLICATION_JSON)
            .mediaType("xml", MediaType.APPLICATION_XML);
}
Run Code Online (Sandbox Code Playgroud)

我可以改变这种行为吗?我想Accept完全忽略标题而不是跳转到错误页面。那可能吗?

Sta*_*avL 1

使用过滤器拦截具有错误标头的请求并将其包装以替换(或删除)错误标头。

在 servlet 过滤器中向请求添加 HTTP 标头

在示例中将getHeader()方法更改为

public String getHeader(String name) {
    if ("accept".equals(name)) {
         return null; //or any valid value
    }
    String header = super.getHeader(name);
    return (header != null) ? header : super.getParameter(name); 
}
Run Code Online (Sandbox Code Playgroud)