【问题标题】:How to keep a Servlet session?如何保持 Servlet 会话?
【发布时间】:2011-01-25 13:33:36
【问题描述】:

我编写了一个简单的 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();

   }
}

【问题讨论】:

    标签: session servlets


    【解决方案1】:

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

    但是,您显然是通过按 F5 或浏览器中的刷新按钮来刷新 initial 请求。初始请求不包含会话 cookie。如果您在 HTML 中添加指向页面本身或同一站点上的另一个页面的链接并单击它,您会看到会话将保持不变。

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


    更新:cookie 是可禁用的,并且取决于主机和上下文。您需要确保在网络服务器(例如 Tomcat &lt;Context&gt; 没有 cookies="false")和网络浏览器(在设置中的某处)中启用了 cookie,并且主机名不是 Intranet 域(某些浏览器不允许在裸主机名上使用 cookie)并且它正在提交到相同的上下文(webapp 上下文名称)。有关如何调试 cookie 的提示,请参阅this answer


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

    【讨论】:

    • 并非如此。在我上面的示例中,我有一个将 GET 发送到同一页面的表单。但是,再次到达同一页面时,无需使用 F5 刷新,无论如何都会创建一个新会话。
    猜你喜欢
    • 1970-01-01
    • 2012-05-14
    • 2010-09-16
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 2015-03-06
    • 2016-04-09
    • 2013-07-17
    相关资源
    最近更新 更多