#java #spring
#java #весна #spring
Вопрос:
У меня есть requiremet для добавления charset=utf-8
ко «всем ответам», кроме ответов данного типа контента. Так, например, ответ, имеющий кодировку application/json
or application/xml
, должен иметь добавленную кодировку, но application/pdf
or application/zip
и eg octet-stream
не должны. Я пытался использовать filter для этого, однако ответ content-type
еще не установлен, поэтому я не могу его проанализировать.
Это не работает, так как тип контента всегда null
@Bean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter() {
@Override
protected void doFilterInternal(
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String contentType = response.getContentType();
if (StringUtils.isNotBlank(contentType)) {
//add other conditions if needed
if (!contentType.contains(MediaType.APPLICATION_PDF_VALUE) amp;amp; !contentType.contains("stream")) {
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
}
}
filterChain.doFilter(request, response);
}
};
return filter;
}
ПС
обычно я бы просто добавлял свойства
spring.http.encoding.charset=UTF-8
spring.http.encoding.force-response=true
но это будет добавляться к каждому ответу, и указание кодировки не имеет смысла для потоков, PDF-файлов и zip-архивов — таким образом, требование соответствия критериям.
Должен ли я обернуть ответ в прокси-объект, как в фильтрах сервлетов?
Комментарии:
1. Это может сделать перехватчик MVC, но может быть и более чистый способ.