Session 如何保持Servlet会话?

Session 如何保持Servlet会话?,session,servlets,Session,Servlets,我编写了一个简单的servlet,我想对其进行测试,以便在刷新浏览器时保留旧会话。但是它并没有,而是在每次刷新页面时创建一个新会话。它不应该只在我关闭浏览器时创建新会话吗? 我使用ServletRunner而不是在Tomcat上运行它,这会是问题吗 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class SessionPlay extends HttpServlet { pu

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

   }
}
import java.io.*;
导入javax.servlet.*;
导入javax.servlet.http.*;
公共类SessionPlay扩展了HttpServlet
{
公共无效数据集(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException
{
分别为setContentType(“文本/html”);
//获取会话对象
HttpSession session=req.getSession(true);
String id=session.getId();
打印输出;
String title=“会话播放”;
//然后写入响应的数据
out=resp.getWriter();
out.println(“”);
out.println(标题);
out.println(id);
out.println(“”);
out.println(“+title+”);
if(session.isNew())
{
out.println(“欢迎新来者”

”; out.println(“”+id+“

”); } 其他的 { out.println(“欢迎回来”

”; out.println(“”+id+“

”); } out.println(“”); out.println(“”); out.println(“”); out.println(“”); out.println(“”); out.close(); } }
会话由cookie维护。当在服务器中创建一个新会话时,它将向响应中添加一个cookie,客户机应该在同一会话中的所有后续请求中发回该cookie

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

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


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



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

实际上不是这样。在上面的示例中,我有一个表单,它向同一页面发送GET。但是,在再次到达同一页面时,如果不使用F5刷新,将创建一个新会话。