2011-01-25 72 views
1

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

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(); 

    } 
} 

回答

2

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

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

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


更新:饼干是禁用的以及主机和上下文相关的。您需要确保在这两个web服务器(例如,Tomcat <Context>没有cookies="false")和webbrowser(某处设置)中启用cookie,并且主机名不是内部网域(某些浏览器不允许裸主机名上的cookie),并且它是提交到相同的上下文(webapp上下文名称)。有关如何调试cookie的提示,请参阅this answer


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

+0

不是真的。在我上面的例子中,我有一个表单发送GET到同一页面。然而,当再次到达同一页面时,如果不用F5刷新,无论如何都会创建一个新的会话。 – starcorn 2011-01-25 14:15:42