6

我正在使用 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);
}

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

但是,当我尝试使用无效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完全忽略标题而不是跳转到错误页面。那可能吗?

4

1 回答 1

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); 
}
于 2017-05-31T06:23:48.273 回答