3

私は J2EE を初めて使用し、セッション管理に行き詰まっています。仕様によると、HttpSession の isNew() メソッドは、サーバーに保存されているクライアントから以前に作成された sessionID がない場合に true を返します。次のコードを実行しましたが、最初の実行でも isNew() メソッドが true を返しません。これまでのところ、次のことを試しました。

  1. ブラウザの履歴を削除しました (すべて.. Firefox を使用しています)。
  2. Netbeans 7.3.1 から Web アプリケーションをビルドして実行します。その場合、新しいセッション ID が生成されますが、isNew() メソッドは確かに true を返しません。
  3. PCを再起動しました(愚かなことですが)。

私の質問は、サーブレット コードで if (session.isNew()){} ブロックを実行するにはどうすればよいですか (ブラウザーの設定などを含む)。そして、私のコードの何が問題になっていますか?

ここに私のコードがあります..

初期ビューのコード:: index.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Welcome to color selection page</h1>
        <form method="POST"
              action="NewPattern">
            Select beer characteristics<br>
                Color:
                <select name="color" size="1">
                    <option value="light">light</option>
                    <option value="amber">amber</option>
                    <option value="brown">brown</option>
                </select>
                <br>
                <input type="SUBMIT">
        </form>
    </body>
</html>

サーブレットのコード::

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class NewServlet extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        HttpSession session = request.getSession();
        try {
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet NewServlet</title>");            
            out.println("</head>");
            out.println("<body>");

            if (session.isNew())
                out.println("It is a new session.  Session ID: " + request.getSession());
            else
                out.println("It is not a new session.  Session ID: " + request.getSession());

            out.println("<h1>Got your chosen color " + request.getParameter("color") + "</h1>");
            out.println("</body>");
            out.println("</html>");
        }
        finally {            
            out.close();
        }
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        processRequest(request, response);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        processRequest(request, response);
    }
    @Override
    public String getServletInfo() {
        return "Short description";
    }
}

DD のコード::

<?xml ...>
<web-app ...>
    <servlet>
        <servlet-name>ServletNew</servlet-name>
        <servlet-class>NewServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletNew</servlet-name>
        <url-pattern>/NewPattern</url-pattern>
    </servlet-mapping>
</web-app>
4

2 に答える 2

4

問題は、最初index.jspにサーブレットにアクセスしてからアクセスすることです。

サーバーは、アクセスする最初のリソースでセッションを作成する可能性が最も高いため、セッションは で新しいものになりindex.jspます。サーブレットは後でアクセスされるため、セッションはもはや新しいものではありません。

基本的に、セッション Cookie を消去してコードをテストし、URL を手動で入力してブラウザでサーブレットを直接開くことができます。

また、転送されるすべてのデータを含む、サーバーへのすべてのリクエストを確認できるネットワーク コンソールを備えた Firefox プラグイン「Firebug」をインストールすることをお勧めします。(もう 1 つの優れたプラグインは、セッション Cookie だけを簡単に消去できる "Web Developer Toolbar" です。)

達成しようとしていることに応じて、ページ フローを再考するか、Struts のような Web フレームワークの使用を検討する必要があります。

于 2013-11-09T20:55:27.330 に答える
-1

新しいセッションの作成を検出するには、 HttpSessionListenerを実装する必要があります

あなたのweb.xml

<listener>
    <listener-class>com.my.pack.age.MyHttpSessionListener</listener-class>
</listener>

または、サーブレット仕様を使用している場合は、 @WebListenerでクラスにアノテーションを付けます3.0

コンテナによってセッションが作成されると、メソッドsessionCreatedが起動され、次の呼び出しでisNew()が返されtrueます。

質問に答えるために - jCoder が言ったことを繰り返します - セッションは、JSP が呼び出されたときに既に作成されています。サーブレット コンテナは、すべての JSP に対してサーブレットを生成します。そのコードを見ると、getSession() この時点で作成されたセッション (まだ作成されていない場合) で、 の呼び出しが既に行われていることがわかります。その後、サーブレットがメソッドを呼び出すとgetSession()、JSP サーブレットによって作成されたセッション リターナが返されます。したがって、常に返されfalseます。

Tomcat によって生成されたサーブレット コード スニペットの例

response.setContentType("text/html; charset=ISO-8859-15");
pageContext = _jspxFactory.getPageContext(this, request, response,
            null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession(); // session is created here
out = pageContext.getOut();
_jspx_out = out;

実際の構成では、ブロックif (session.isNew()){}は決して実行されません。セッションの作成時にいくつかのアクションを実行したい場合は、セッションリスナーを作成して構成するか、MarkThomas の提案に従ってセッションを作成しないようにセッションを構成if (session.isNew()){}して、サーブレットのブロックを実行できるようにします。

于 2013-11-09T21:19:35.393 に答える