Как настроить приложение весенней загрузки для поддержки кодирования 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

Должна решить вашу проблему, если в запросе указаны правильные заголовки.

Другие вопросы по тегам