Zuulを介してクライアントにリクエストを送信するとき、Zuulクエリ文字列を変更するようです。より具体的には、クライアントがURLエンコードされたクエリ文字列を受信する必要がある場合、Zuulはクエリ文字列を1回デコードします。具体的な例は次のとおりです。
"ならhttp://localhost:8080/demo/demo?a=http%3A%2F%2Fsomething/"クライアントに送信され、クライアントはクエリ文字列として受信します" a =http://something/"
Zuulのコードを調べると、関数 "buildZuulRequestQueryParams"は "HTTPRequestUtils.getInstance()。getQueryParams();"を使用しています。これはクエリ文字列をデコードします。
これは望ましい機能ですか、それともバグですか?
回答:
回答№1は2Zuulは実際にこの振る舞いを無効にするためのフラグを提供しています。
8。9クエリ文字列エンコーディング 入ってくるリクエストを処理するとき、クエリパラメータはZuulフィルタの可能な修正に利用できるようにデコードされます。その後、それらは再エンコードされ、バックエンド要求はルートフィルタで再構築されます。 JavascriptのencodeURIComponent()メソッドでエンコードされている場合、結果は元の入力と異なる場合があります。ほとんどの場合、これで問題は発生しませんが、Webサーバーによっては複雑なクエリ文字列のエンコーディングを選択することができます。
クエリの元のエンコードを強制する次の例に示すように、HttpServletRequest :: getQueryStringメソッドでクエリ文字列がそのまま使用されるように、ZuulPropertiesに特別なフラグを渡すことができます。
application.yml
zuul:
forceOriginalQueryStringEncoding: true
[注意]この特別なフラグはとだけ働きますSimpleHostRoutingFilter また、クエリパラメータを簡単にオーバーライドする機能を失うことになります。 RequestContext.getCurrentContext()。setRequestQueryParams(someOverriddenParameters)、 クエリ文字列は現在オリジナルで直接取得されるため HttpServletRequest
回答№2の場合は0
私は昨日同じ問題に直面していました。これに関係していると思う プルリクエスト。 (PRがマージされるのを待たずに)この問題を解決するより早い方法は、同じパッケージとクラス名を使用して自分のプロジェクト内のクラスを書き換えてフレームワーククラスをオーバーライドすることです。