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

时间:2017-05-31 04:53:13

标签: 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);
}

我无法将ignoreAcceptHeader设置为true,因为我的一些客户依赖此标头进行回复。

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

12:18:14.498 468443 [6061] [qtp1184831653-73] DEBUG o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver  
Resolving exception from handler [public MyController.myAction() throws java.io.IOException]: org.springframework.web.HttpMediaTypeNotAcceptableException: 
Could not parse accept header [: application/json,*/*]: Invalid mime type ": application/json": Invalid token character ':' in token ": application"

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

1 个答案:

答案 0 :(得分:1)

使用过滤器拦截带有错误标题的请求,并将它们换成(或删除)错误的标题。

Adding an HTTP Header to the request in a servlet filter

在示例中,将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); 
}