2014-11-21 88 views
0

摘要:我开发了一个Web应用程序中的登录系统(使用java,jsp & javascript)。在Web应用程序中客户端会话变量的脏读取

所需的功能:

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

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

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

+0

由于浏览器标签共享相同的会话......当用户点击登录页面的第二次你应该重定向到你的“家”页面登录后。 – scunliffe 2014-11-21 12:28:17

回答

0

会话是由IP和用户代理(即浏览器)。所以你不能在同一浏览器中阻止多个标签。你也不想。如果你需要这样做,因为你的设计有一个主要缺陷。如果您只是寻找一种以两位用户身份来测试自己的方式,请以Chrome用户身份登录并以Firefox身份登录。

您与仍然能够得到一个页面注销后的问题显然是,你没有这样的事,以防止unathenticated用户在获得:

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