Как настроить Spring, чтобы игнорировать неверный заголовок Accept?

Я использую 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, так как некоторые из моих клиентов полагаются на этот заголовок для ответа.

Но когда я пытаюсь получить доступ к моему API с недействительным Accept как заголовок Accept: :*/* (обратите внимание, что лишнее двоеточие), 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 ответ

Решение

Используйте фильтр, чтобы перехватывать запросы с неправильным заголовком и переносить их, заменяя (или удаляя) неправильный заголовок.

Добавление заголовка 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); 
}
Другие вопросы по тегам