我编写了一个我想要测试的简单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();
}
}
答案 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文件。