在Web应用程序中客户端脏对会话变量的读取

时间:2014-11-21 12:26:01

标签: jsp session session-scope

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

所需功能:

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

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

预期:第二个标签登录时不应再次获取会话变量。

1 个答案:

答案 0 :(得分:0)

会话由IP和用户代理(即浏览器)提供。因此,您无法在同一浏览器中阻止多个标签。你也不应该这样做。如果你需要这样做,因为你的设计存在重大缺陷。如果您只想找到一种方法来测试自己是两个用户,请以Chrome用户身份登录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;
}

这样,已经登录的用户无法在不先注销的情况下再次填写登录表单。

它也可能是一个缓存问题。如果您允许浏览器缓存受保护的页面,那么在用户注销后,如果他们再次访问该页面,他们可能会看到该页面,因为它已被缓存。因此,设置no-cache标头:

response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma","no-cache");