如何不在多个浏览器选项卡之间共享 session ?
我在 JSP/Servlet 应用程序中使用 Spring Security,我想知道“我们如何使用 Spring Security 实现用户在更改浏览器选项卡时被迫再次登录的行为?” .
免责声明 问题类似于 this Question和 this question ,但由于这两个问题都太老了(即 4.7 岁),我相信今天一定有某种方法可以实现这一目标,不是吗?
最佳答案
成功登录后,在 sessionStorage.setItem('userId',userId) 中添加一些值,当用户打开新选项卡并尝试登录时,检查 sessionStorage.getItem('userId') 是否可用,如果为 null,则表示它是一个新标签/重定向到登录页面。
session 存储是特定于选项卡的,数据不会在不同选项卡之间共享。 session 存储在现代浏览器中运行。
查看此 link 了解详细信息
试试下面的代码
登录成功后添加以下代码
<script>
if(typeof(Storage) !== "undefined") {
sessionStorage.setItem("uniqueIdSessionStorage", "xyz");
}
</script>
sessionStorage.getItem('uniqueIdSessionStorage') // this will be a tab specific you will not get xyz for other tabs.
1) 检查 sessionStorage.getItem('uniqueIdSessionStorage') 是否不为空,如果为空则表示新标签页和新用户。
2) 在服务器端总是像下面的代码一样存储 session 属性
session.setAttribute("userId"+UniqueValuePerUser,userId);
3) 这样您就可以使用单个 session 对象进行多次登录,因为每个用户 key 都是唯一的。
4) 在请求参数中以某种方式传递 sessionStorage 值服务器端。一种方法是发送 url 或隐藏在输入中的某个地方。
5) 现在,如果您从选项卡中获得 12345 值。然后使用下面的代码从 session 中获取详细信息
String uniqueId= request.getParameter("uniqueId"); // value will be 12345
session.getAttribute("userId"+uniqueId);
如果你从 tab 中得到 45678 的值,那么
String uniqueId= request.getParameter("uniqueId"); // value will be 45678
session.getAttribute("userId"+uniqueId) // and other details from session using unique id;
6) 这种在单个 session 中使用唯一 key 的方式可以实现多次登录,但如果一个注销并且您使 session 无效,其他用户也将被注销,因为 session 对象是一个具有唯一 key 的对象。
7) 从 session 中删除该特定 key ,而不是使 session 无效。
session.removeAttribute("userId"+uniqueId);
关于javascript - 如何阻止浏览器在选项卡之间共享 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30662431/