Здравствуйте! Я хочу изменить некоторые из заголовков ответа моего API после того, как я завершил обработку (выполнил логику) и завершил работу с кодом состояния HTTP.
Например, если ответ 404, то включите специфичные дляпример Cache-Control
Пример заголовков не кэшируется, или что-то в этом роде.
Я уже зарегистрировал 2 OncePerRequestFilter
, которые работают нормально - но, очевидно, я не могу сделать логику - после завершения обработки.У CacheControlFilter
уже есть логика, которая добавляет по умолчанию некоторые заголовки Cache-Control
- например, кэш на 15 секунд и т. Д. Кажется, что это происходит (добавление заголовков к ответу) на очень ранней стадии отправки и когдадоходит до фазы выполнения фактического Controller/Endpoint
, и возникает исключение или ошибка, которая, очевидно, будет обработана советом и т. д., я не могу mutate
эти уже существующие заголовки, которые уже были добавлены фильтром.
@Bean
public FilterRegistrationBean filterOne() {
Filter filter = new FilterOne();
return createFilter(filter, "FilterOne",List.of("/*"));
}
@Bean
public FilterRegistrationBean cacheControlFilter() {
Filter filter = new CacheControlFilter();
return createFilter(filter, "CacheControlFilter", List.of("/*"));
}
private FilterRegistrationBean createFilter(Filter aFilter, String filterName,
List<String> urlPatterns) {
FilterRegistrationBean filterRegBean = new FilterRegistrationBean(aFilter);
filterRegBean.addUrlPatterns(urlPatterns.toArray(new String[0]));
filterRegBean.setName(filterName);
filterRegBean.setEnabled(true);
filterRegBean.setAsyncSupported(true);
return filterRegBean;
}
Я уже пытался добавить HttpServletResponseWrapper
, как указано в этих сообщениях здесь и здесь на CacheControlFilter
, но это не похожеработать.Я также видел подобный поток SO здесь .
HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(response) {
@Override
public void setStatus(int sc) {
super.setStatus(sc);
handleStatus(sc);
}
@Override
@SuppressWarnings("deprecation")
public void setStatus(int sc, String sm) {
super.setStatus(sc, sm);
handleStatus(sc);
}
@Override
public void sendError(int sc, String msg) throws IOException {
super.sendError(sc, msg);
handleStatus(sc);
}
@Override
public void sendError(int sc) throws IOException {
super.sendError(sc);
handleStatus(sc);
}
private void handleStatus(int code) {
if(code == 404)
addHeader("Cache-Control, "xxx");
}
};
Но код вообще не выполняется!Поэтому я хочу манипулировать заголовками Cache-Control на втором фильтре только после того, как обработка завершена, и я готов вернуть ответ.
Я не уверен, что тот факт, что у меня тоже есть, делает некоторыеочистка и настройка ответов на ошибки - все перемешивается!
@ControllerAdvice
@Slf4j
public class GlobalErrorHandler
Обновление: в качестве примечания, когда мой контроллер выдает исключение или ошибку, вышеупомянутый GlobalErrorHandler
вызывается, и там я выполняю специальныйобработка, возвращая error response
.Однако я вижу, что magically
ответ уже содержит заголовки default
, заполненные фильтром (CacheControlFilter).В итоге получается немного странно, я добавляю дополнительную логику, чтобы изменить контрольный заголовок, и в итоге получаю ответ с одинаковым заголовком 2 раза (1 со значением, установленным CacheControlFilter
, а затем любое специальное значение IЯ пытаюсь переопределить ControllerAdvice
Любые советы или помощь, спасибо! Я использую Spring Boot 2.1.2
с Undertow
в качестве основного контейнера сервлета.