1

サーブレット フィルターが前面にある 2 台のホスト マシンに Java Web アプリケーションをデプロイしています。1 つのホストのアプリケーションに POST 要求を送信しましたが、これはフィルターによってインターセプトされ、別のホストにリダイレクトされます。

public void doFilter (ServletRequest request, ServletResponse response,
       FilterChain filterChain)
{
    ...
    if(shouldRedirect) {
        httpResponse.sendRedirect(redirectLocation);
    }
}

2 番目のマシンでは、要求はフィルターを通過し、Resource クラスの REST API によって処理されます。

@POST
public Response handleRequest(InputStream stream)
{
    ...
}

streamオブジェクトは、POST 要求本文の一部として送信されます。リダイレクト後、リクエスト本文は送信されず、stream空になります。リダイレクト後にリクエスト本文 (または少なくともその一部) を保持するにはどうすればよいですか?

ありがとう。

4

3 に答える 3

6

私が見つけたもう1つの方法は、307(一時的なリダイレクト)です。これにより、元のリクエストの本文が保持されるため、この場合は機能します。307リダイレクトには、ここで詳しく説明するようにセキュリティ上の影響がありますが、元のホストがブロッキングHTTPリクエストのプロキシとして機能しないという利点があります。

public void doFilter(...)
{
    ...
    httpResponse.setStatus(TEMPORARY_REDIRECT);
    httpResponse.setHeader("Location", redirectLocation);
    return;
}
于 2013-02-19T06:39:29.673 に答える
2

sendRedirect()ユーザーのブラウザに再度アクセスし、ブラウザからリダイレクトされた URL にアクセスします。

そうは言っても、POST データは、最初に受信したホストでのみ使用できますfirst request。つまり、この場合はフィルターです。

できること:

リダイレクト URL を変更して、POST データを次のように含めます。Request Parameters in GET url

例えばhost2\servlet?param=one&param2=two

URL リダイレクトの詳細を読む

于 2013-02-18T11:28:23.130 に答える
2

代わりに、redirectLocation への投稿を実行します。sendRedirect はクライアントにその場所を変更するように指示しているため、その時点で新しい HTTP リクエストを開始しています。

リダイレクトを実行すると、クライアントに新しい URL への元の POST 要求を開始させることができます。

于 2013-02-18T11:28:27.110 に答える