Как настроить приложение весенней загрузки для поддержки кодирования UTF-8 и GBK?
Я использую весеннюю загрузку в своем проекте, и я запускаю некоторые проблемы с кодировкой.
В проекте есть контроллер (ниже), который принимает запрос с заголовком типа контента "application/x-www-form-urlencoded;charset=GBK".
@RequestMapping(value = "/notify",headers ={"Content-Type=application/x-www-form-urlencoded;charset=GBK"} , method = RequestMethod.POST, produces = "application/x-www-form-urlencoded; charset=GBK")
public ResponseEntity<String> notify(@RequestParam(name = "p") String plain, @RequestParam("s") String signature), HttpServletRequest request){}
Когда третьи лица вызывают этот API, они кодируют тело запроса с помощью GBK. Как только тело содержит китайские кодировки, я получил неверный параметр, который не читается человеком, что-то вроде этого "результата".
Потому что клиент отправляет тело запроса с кодированием GBK, но пружинная загрузка декодирует тело запроса с помощью UTF-8, который является кодировкой кодировки по умолчанию для весенней загрузки.
В проекте доступны разные сторонние разработчики, большинство из них используют UTF-8, поэтому я не могу изменить кодировку проекта на GBK, настроив файл yml следующим образом:
spring:
http:
encoding:
charset: GBK
enabled: true
Поэтому моя первая мысль - отменить неверную строку, которую я получил. Но я провалил следующий тест.
String para = "p=result中文的&s=ad98adj";
byte[] bytes = para.getBytes("GBK");
ByteChunk byteChunk = new ByteChunk();
byteChunk.setBytes(bytes , 0 , bytes.length);
byteChunk.setCharset(Charset.forName("utf-8"));
String receive = byteChunk.toString();//this is the wrong string
//reverse
byteChunk.reset();
bytes = receive.getBytes("GBK");
byteChunk.setBytes(bytes , 0 ,bytes.length);
byteChunk.setCharset(Charset.forName("GBK"));
receive = byteChunk.toString(); //still the wrong string
Итак, как я могу использовать одно приложение с пружинной загрузкой для поддержки запросов кодирования GBK и UTF-8.
2 ответа
Добавление бина CharacterEncodingFilter может решить проблему, обратившись к форме https://github.com/spring-projects/spring-boot/issues/1182
@Bean
CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
filter.setForceEncoding(true);
return filter;
}
У меня была похожая проблема, и я обнаружил, что в Spring Boot "forceEncoding" включен по умолчанию. Это приводит к тому, что набор символов запроса переопределяется и устанавливается в UTF-8 каждый раз в их фильтре.
См. Приложение A. Общие свойства приложения.
Ключевая часть:
По умолчанию true, когда "force" не было указано.
Так что установка либо
spring.http.encoding.force=false
или же
spring.http.encoding.force-request=false
Должна решить вашу проблему, если в запросе указаны правильные заголовки.