web-dev-qa-db-ja.com

response.sendRedirect()を使用して非表示パラメーターを渡す

隠されたパラメーターをどのように渡しますか?ページ(test.jsp)を呼び出したいが、投稿のような2つの非表示パラメーターも渡したい。

response.sendRedirect("/content/test.jsp");
25
Ashish Anand

TheNewIdiotの答え は、リダイレクトを通じてリクエストで属性を送信できない問題と理由を正常に説明します。可能な解決策:

  1. 転送を使用します。これにより、リクエスト属性をビューに渡すことができ、 ServletRequest#getAttribute または Expression Language および [〜#〜] jstl [〜#〜] を使用します。短い例(TheNewIdiotの答えを再利用する)コード。

    コントローラー(サーブレット)

    request.setAttribute("message", "Hello world");
    RequestDispatcher dispatcher = servletContext().getRequestDispatcher(url);
    dispatcher.forward(request, response);
    

    View(JSP)

    スクリプトレットの使用:

    <%
        out.println(request.getAttribute("message"));
    %>
    

    これは、情報目的のためだけです。スクリプトレットの使用は避ける必要があります回避方法Java JSPファイルのコード? 。以下に、ELとJSTLを使用した例を示します。

    <c:out value="${message}" />
    
  2. 転送を使用できない場合(それが気に入らないか、そのように感じないか、リダイレクトを使用する必要があるため)、オプションはメッセージをセッション属性として保存し、ビューにリダイレクトします、ビューのセッション属性を回復し、セッションから削除します。関連するデータのみを使用してユーザーセッションを常に保持することを忘れないでください。コード例

    コントローラー

    //if request is not from HttpServletRequest, you should do a typecast before
    HttpSession session = request.getSession(false);
    //save message in session
    session.setAttribute("helloWorld", "Hello world");
    response.sendRedirect("/content/test.jsp");
    

    表示

    繰り返しますが、スクリプトレットを使用してこれを表示し、次にEL + JSTLを使用します。

    <%
        out.println(session.getAttribute("message"));
        session.removeAttribute("message");
    %>
    
    <c:out value="${sessionScope.message}" />
    <c:remove var="message" scope="session" />
    
45
Luiggi Mendoza

通常、 sendRedirect() メソッドを使用してPOSTリクエストを送信することはできません。使用することができます RequestDispatcher to forward() リクエストは、同じWebアプリケーション、同じコンテキスト内にあります。

RequestDispatcher dispatcher = servletContext().getRequestDispatcher("test.jsp");
dispatcher.forward(request, response);

HTTP仕様では、すべてのリダイレクトはGET(またはHEAD)の形式である必要があると規定されています。セキュリティが問題になる場合は、クエリ文字列パラメーターの暗号化を検討できます。別の方法は、メソッドPOSTで非表示のフォームを作成し、ページがロードされたときにjavascriptで送信することにより、ターゲットに対してPOSTを実行できます。

4
NINCOMPOOP

sessionを使用して、サーブレット#1で_response.sendRedirect_を使用して、サーブレット#1からサーブレット#2にパラメータ(name)を正常に渡しました。サーブレット#1コード:

_protected void doPost(HttpServletRequest request, HttpServletResponse response) {
    String name = request.getParameter("name");
    String password = request.getParameter("password");
    ...
    request.getSession().setAttribute("name", name);
    response.sendRedirect("/todo.do");
_

サーブレット#2では、nameを取得する必要はありません。すでにセッションに接続されています。 String name = (String) request.getSession().getAttribute("name");を実行できますが、これは必要ありません。

サーブレット#2がJSPを呼び出す場合、JSP Webページでnameを次のように表示できます。

_<h1>Welcome ${name}</h1>_

0
Raymond Gan