2

プロジェクトでスプリング ブートを使用していますが、エンコードの問題が発生しています。

プロジェクトには、コンテンツ タイプ ヘッダー「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 を使用しているため、次のように yml ファイルを構成してプロジェクトのエンコードを GBK に変更することはできません。

spring:
  http:
    encoding:
      charset: GBK
        enabled: true

だから私の最初の考えは、私が得た間違った文字列を逆にすることです.しかし、私は次のテストで失敗します.

String para = "p=result中文的&amp;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 エンコード要求の両方をサポートするにはどうすればよいでしょうか。

4

2 に答える 2

3

CharacterEncodingFilter Bean を追加すると、フォーム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;
}
于 2016-10-09T16:14:55.413 に答える
0

同様の問題があり、Spring Boot ではデフォルトで「forceEncoding」が有効になっていることがわかりました。これにより、リクエストの文字セットがオーバーライドされ、フィルターで毎回 UTF-8 に設定されます。

付録 Aを参照してください。共通のアプリケーション プロパティ

重要な部分は次のとおりです。

「force」が指定されていない場合、デフォルトは true です。

したがって、どちらかを設定します

spring.http.encoding.force=false

また

spring.http.encoding.force-request=false

リクエストに正しいヘッダーがある限り、問題を解決する必要があります。

于 2018-11-09T05:49:16.497 に答える