如何保持Servlet会话?

时间:2011-01-25 13:33:37

标签: session servlets

我编写了一个我想要测试的简单servlet,以便在刷新浏览器时保留旧会话。但是,它并不是每次刷新页面时都会创建一个新会话。是不是应该只在关闭浏览器时才创建新会话? 我正在使用ServletRunner而不是在Tomcat上运行它,这可能是问题吗?

import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class SessionPlay extends HttpServlet
{
   public void doGet (HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException
   {

      resp.setContentType("text/html");

      //Get session object
      HttpSession session = req.getSession(true);

      String id = session.getId();


      PrintWriter out;
      String title = "Session play";



      // then write the data of the response
      out = resp.getWriter();

      out.println("<html><head><title>");
      out.println(title);
      out.println(id);
      out.println("</title></head><body>");
      out.println("<h1>" + title + "</h1>");

      if(session.isNew())
      {
         out.println("<p>Welcome new comer</p>");
         out.println("<p>" + id + "</p>");
      }
      else
      {
         out.println("<p>Welcome back</p>");
         out.println("<p>" + id + "</p>");
      }

      out.println("<form action=SessionPlay method=get>");
      out.println("<input type=input name=param1>");
      out.println("<input type=submit>");
      out.println("</form>");

      out.println("</body></html>");
      out.close();

   }
}

1 个答案:

答案 0 :(得分:2)

会话由Cookie维护。当在服务器中创建新会话时,它将向响应中添加一个cookie,客户端应该在同一会话中的所有后续请求中发回该cookie。

但是,您可以通过在浏览器中按F5或刷新按钮来刷新初始请求。初始请求不包含会话cookie。如果您在HTML中添加指向页面本身或同一站点上的其他页面的链接并单击它,您将看到该会话将被维护。

解决此问题的方法之一是创建一个过滤器,在创建会话时执行重定向。


更新:Cookie是可禁用的,并且依赖于主机和上下文。您需要确保在两个Web服务器(例如Tomcat <Context>没有cookies="false")和webbrowser(设置中的某个位置)中启用了Cookie,并且主机名不是Intranet域(某些浏览器不允许使用Cookie)在裸体主机名上)并且它正在提交到相同的上下文(webapp上下文名称)。有关如何调试cookie的提示,请参阅this answer


与问题无关,在servlet中发出HTML并不是最佳做法。这项工作将由JSP文件完成。在执行所有必要的Java代码操作后,使用RequestDispatcher#forward()将请求转发到JSP文件。