1

私はhttpclient 4.2.5を使用して、リダイレクトも処理する必要があるhttpリクエストを作成しています。コンテキストを理解するための小さな例を次に示します。

  1. A は HTTP 要求を (httpclient 4.2.5 を使用して) B に送信します。
  2. B は 302 リダイレクト (C への URL を含む) を A に送り返します。
  3. A は C へのリダイレクトに従います
  4. C はリクエスト URL を取得し、それを処理します

C が (HttpServlet API) によってリクエスト URL を解析する場合request.getRequestURL()、ステップ 1 からの元のリクエストのホストとポートなどが含まれますが、これは誤りです。

問題は、httpclient がリダイレクトを処理するステップ 2 に存在します。元のリクエスト (ステップ 1) から現在のリクエスト (ステップ 3) にすべてのヘッダーをコピーするだけです。grepcode:
DefaultRequestDirectorを介して、責任あるコードを既に確認しました。

HttpUriRequest redirect = redirectStrategy.getRedirect(request, response, context);
HttpRequest orig = request.getOriginal();
redirect.setHeaders(orig.getAllHeaders());

元のリクエストのすべてのヘッダーが現在のリクエストにコピーされる理由がよくわかりません。
たとえば、単純なテストに cURL を使用すると、期待どおりに動作します。C は正しいホストとポートを受け取ります。

元のヘッダーがその後にコピーされるため、独自のリダイレクト戦略を実装しても役に立ちません。

4

2 に答える 2

0

呼び出し元によってメッセージに明示的に追加されたorig.getAllHeaders()ヘッダーの配列を返すことに注意してください。上記のコードは、、などによって自動的に生成されたリクエスト ヘッダーをコピーしませDefaultRequestDirectorHttpClientHostContent-LengthTransfer-Encoding

問題が発生しているセッションのワイヤログを投稿すると、リダイレクトが期待どおりに機能しない理由がわかります。

于 2013-07-31T13:31:52.370 に答える