6

サーブレット応答を、それが来たときと同じページ (別名: 前のページ、または「サーブレット」呼び出し元) に転送しようとしています。

私は多くの答えを見てきました(これこれのような)が、それでもうまくいきません。

私は通常、サーブレットの応答を別のページにリダイレクトするために次のことを行います。

request.getRequestDispatcher("MyNewPage").forward(request, response);

しかし、解決策として見た他のオプションの「MyNewPage」を次のように変更しようとしました。

request.getRequestDispatcher((String)request.getAttribute("javax.servlet.forward.request_uri")).forward(request, response);
request.getRequestDispatcher(request.getHeader("referer")).forward(request, response);

およびその他のオプションがあり、それを機能させることはできません。

私は何を間違っていますか?

4

2 に答える 2

17

まず最初にrequest.getHeader("referer")完全なURLを返しますが、http://server[:port]/request.getRequestDispatcher()に渡すものが次のようにアプリケーションコンテキストに追加されるため、削除する必要があります。

/NameOfApp/http:/localhost:8084/NameOfApp/test.jsp

ディスパッチャメソッドに以下を渡す必要があるため、これは必要なことではありません。

test.jsp

最初から物事を取り上げる場合、最初のリクエストは次のURLから始まります。

http://localhost:8084/RequestDispatcher/test.jsp

転送は機能しますが、2回目にサーブレットにリクエストを送信すると、サーブレットはそれ自体に転送します。したがって、サーブレットがそれ自体を呼び出すループに入ります。なぜこれが起こるのでしょうか?フォームからサーブレットを呼び出すため、これは、ブラウザのアドレスボックスのURLアドレスが、最初のリクエスト後にサーブレットのURLアドレスに変更されることを意味します。

http://localhost:8084/RequestDispatcher/NewServlet

サーブレットはリクエストをJSPページに転送し、ブラウザはそれだけを表示しますが、ブラウザのアドレスボックスのURLは、JSPページではなくサーブレットを含むURLのままです。

http://localhost:8084/RequestDispatcher/NewServlet

したがって、次に送信を押すと、サーブレットはリクエストをそれ自体に転送しようとします。もし私があなたなら、リダイレクトを使用します。それはあなたの目的により適しているようです:

response.sendRedirect(request.getHeader("referer"));

これにより、ブラウザのアドレスボックスのURLが常に変更され、サーブレットがループするのを防ぎます。これはリクエストパラメータに影響を与えますが、リダイレクトURLにいつでも追加するか(機密情報でない場合)、リダイレクトによって行われる次の最初のリクエストで取得するまでセッションに保存できます。

JSFのようなフレームワークは、これらの問題からあなたを救うでしょう。

forwardを使用できる最も簡単な解決策は、request.getHeader( "referer")を使用する代わりに、サーブレットを呼び出したJSP(viewid)を保持するフォームの非表示パラメーターです。ただし、誰かが意図的に値を変更してサーブレットコンテナを強制的にループさせ、最終的にVMをクラッシュさせる可能性があるため、ループをチェックする必要があります。ただし、リクエスト属性を使用して、チェーン内の前のリクエストの記録を保持することができます。同じ場合は、エラーで応答します。したがって、サーブレットでは、転送先を決定するために非表示フィールドの値を使用します。

request.getRequestDispatcher(request.getParameter("viewid")).forward(request, response);

そしてあなたのJSPで:

<input type="hidden" name="viewid" value="test.jsp">

これであなたの要件をカバーできると思います。

于 2012-08-17T22:56:35.840 に答える