检测新的HttpSession

时间:2013-11-09 20:20:58

标签: java jsp java-ee servlets httpsession

我是J2EE的新手并且坚持使用会话管理。根据规范,如果之前没有创建,则HttpSession的isNew()方法返回true 来自客户端的sessionID存储在服务器上。 我运行了以下代码,即使在第一次执行时,isNew()方法也没有返回true。到目前为止,我已尝试过以下内容:

  1. 删除了浏览器的历史记录(所有内容......我使用的是Firefox)。
  2. 从Netbeans 7.3.1构建并运行我的Web应用程序。在这种情况下,会生成一个新的会话ID,但isNew()方法肯定不会返回true。
  3. 重新启动电脑(虽然是一个愚蠢的人)。
  4. 我的问题是,如何在servlet代码中执行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>
    

    servlet的代码::

    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>
    

2 个答案:

答案 0 :(得分:4)

问题是您首先访问index.jsp然后访问servlet。

服务器很可能会在您访问的第一个资源上创建会话,因此会话在index.jsp上是新的。之后访问servlet,因此会话不再是新的。

您基本上可以通过清理会话cookie来测试代码,并通过手动输入URL直接在浏览器中打开servlet。

我还建议安装Firefox插件“Firebug”,它有一个网络控制台,您可以在其中查看对服务器的每个请求,包括所有传输的数据。 (另一个很棒的插件是“Web Developer Toolbar”,它可以很容易地清理会话cookie。)

根据您要实现的目标,您需要重新考虑页面流,或者考虑使用像Struts这样的Web框架。

答案 1 :(得分:-1)

为了检测新会话的创建,您需要实现HttpSessionListener

web.xml

中配置它
<listener>
    <listener-class>com.my.pack.age.MyHttpSessionListener</listener-class>
</listener>

如果使用servlet规范3.0

,则使用@WebListener注释该类

当容器创建会话时会触发方法sessionCreated,下一次调用isNew()将返回true

要回答这个问题 - 并重复jCoder所说的内容 - 在调用JSP时已经创建了会话。 servlet容器为每个JSP生成一个servlet,如果你查看那个代码,你会发现getSession()的调用已经在那里发生了一个会话 - 如果还没有创建 - 此时创建。当您的servlet调用方法getSession()时,会话返回者是通过JSP-servlet创建的。因此,它始终返回false

tomcat生成的Servlet代码片段

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所建议的那样 - 以便可以执行servlet中的块if (session.isNew()){}