会话是通过 IP 和用户代理(即浏览器)进行的。因此,您无法阻止同一浏览器中的多个选项卡。你也不应该想要。如果您需要这样做,是因为您的设计存在重大缺陷。如果您只是想以两个用户身份测试自己,请以一个用户身份登录 Chrome 并以另一个用户身份登录 Firefox。
您在注销后仍然能够访问页面的问题显然是您没有类似的东西来防止未经身份验证的用户进入:
String somevar = session.getAttribute("somevar");
if(somevar == null)
{
response.sendRedirect("loginpage");
return;
}
同样在登录页面上,如果用户已经登录:
String somevar = session.getAttribute("somevar");
if(somevar != null)
{
response.sendRedirect("mainpage");
return;
}
这样,已经登录的用户如果不先注销就无法再次填写登录表单。
它也可能是一个缓存问题。如果您允许浏览器缓存受保护的页面,那么在用户注销后,如果他们再次访问该页面,他们可能会看到该页面,因为它已被缓存。因此,设置无缓存标头:
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma","no-cache");