0

摘要:我在 Web 应用程序中开发了一个登录系统(使用 java、jsp 和 javascript)。

所需功能:

不允许用户同时从同一浏览器的两个不同选项卡登录系统。如果任何用户尝试错误消息“用户已登录”。

问题:步骤 1)当我尝试从其他/第二个选项卡登录时,显示错误消息(如预期的那样)并再次重定向到登录页面。步骤 2)然后我从第一个选项卡注销,在后端我删除所有创建的会话变量。步骤 3)然后,当我尝试从其他/第二个选项卡登录页面登录时,观察到我再次获得会话变量,预计会获得空变量或空变量(因为我已经在注销请求的后端删除了它们)。

预期:不应再次获取第二个选项卡登录的会话变量。

4

1 回答 1

0

会话是通过 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");
于 2014-11-22T00:04:25.330 回答