首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在浏览器选项卡中区分会话?

如何在浏览器选项卡中区分会话?
EN

Stack Overflow用户
提问于 2008-12-15 15:10:58
回答 12查看 266K关注 0票数 137

在使用JSP和Servlet用java实现的web应用程序中;如果我将信息存储在用户会话中,则可以从同一浏览器的所有选项卡中共享这些信息。如何在浏览器选项卡中区分会话?在此示例中:

代码语言:javascript
复制
<%@page language="java"%>
<%
String user = request.getParameter("user");
user = (user == null ? (String)session.getAttribute("SESSIONS_USER") : user);
session.setAttribute("SESSIONS_USER",user);
%>
<html><head></head><body>
<%=user %>
<form method="post">
User:<input name="user" value="">
<input type="submit" value="send">
</form>
</body></html>

将此代码复制到jsp页面(testpage.jsp)中,将此文件部署到服务器上web应用程序的现有上下文中(我使用Apache Tomcat),然后使用正确的URL (localhost/context1/testpage.jsp)打开浏览器(FF、IE7或Opera),在输入中键入您的姓名并提交表单。然后在同一浏览器中打开一个新选项卡,然后您可以在新选项卡上看到您的姓名(从会话中获取)。要小心浏览器缓存,有时它看起来不会发生,但它在缓存中,刷新第二个选项卡。

谢谢。

EN

回答 12

Stack Overflow用户

发布于 2011-06-21 04:51:31

URL属性是唯一可以在选项卡活动中保持不变的东西,但可以保持独立(而不是window.name垃圾)。

票数 16
EN

Stack Overflow用户

发布于 2009-07-15 20:53:51

我已经提出了一个新的解决方案,它有很小的开销,但到目前为止似乎还只是一个原型。一种假设是你在一个荣誉系统环境中登录,尽管这可以通过在每次切换选项卡时重新请求密码来进行调整。

使用localStorage (或等效的)和HTML5存储事件来检测新的浏览器选项卡切换到哪个用户处于活动状态。发生这种情况时,创建一个重影覆盖,并显示一条消息,说明您不能使用当前窗口(或者暂时禁用该窗口,您可能不希望它如此显眼。)当窗口重新获得焦点时,发送一个AJAX请求使用户重新登录。

此方法的一个警告:您不能在没有焦点的窗口中发生任何正常的AJAX调用(即,依赖于您的会话的调用)(例如,如果您的调用发生在延迟之后),除非您在此之前手动执行AJAX重新登录调用。所以你真正需要做的就是首先检查你的AJAX函数以确保localStorage.currently_logged_in_user_id === window.yourAppNameSpace.user_id,如果没有,首先通过AJAX登录。

另一个是竞争条件:如果你切换窗口的速度足够快,就会把它搞糊涂,最终可能会出现一个relogin1->relogin2-> ajax1 ->ajax2序列,ajax1是在错误的会话下执行的。解决方法是将登录AJAX请求推到一个数组上,然后在存储上,在发出新的登录请求之前,中止所有当前请求。

最后一个需要注意的问题是窗口刷新。如果有人在您的AJAX登录请求处于活动状态但未完成时刷新该窗口,则会以错误的人的姓名刷新该窗口。在这种情况下,您可以使用非标准的beforeunload事件来警告用户潜在的混淆,并要求他们单击Cancel,同时重新发出AJAX登录请求。然后,他们可以搞砸的唯一方法是在请求完成之前单击OK (或者意外地按下enter/空格键,因为OK是默认设置--对于这种情况很不幸)。还有其他方法可以处理这种情况,比如检测F5和Ctrl+R/Alt+R按键,这些方法在大多数情况下都有效,但可能会因用户键盘快捷键重新配置或替代操作系统使用而受挫。然而,这在现实中有点边缘情况,最坏的情况永远不会那么糟糕:在荣誉系统配置中,您将作为错误的人登录(但您可以通过个性化页面的颜色、样式、突出显示的姓名等来明确这一点);在密码配置中,责任落在最后一个输入密码注销或共享会话的人身上,或者如果此人实际上是当前用户,则不存在漏洞。

但最终您会得到一个每个选项卡一个用户的应用程序,它(希望)只是按照它应该的方式运行,而不必设置配置文件、使用IE或重写URL。但是,请确保在每个选项卡中清楚地显示谁登录到该特定选项卡中。

票数 13
EN

Stack Overflow用户

发布于 2014-04-15 14:17:14

我们遇到了这个问题,我们很容易就解决了。我的意思是简单,因为不涉及编程。我们想要做的是让用户在相同的浏览器窗口中登录到多个帐户,而不会与会话冲突。

所以解决方案是随机的子域。

代码语言:javascript
复制
23423.abc.com
242234.abc.com
235643.abc.com

因此,我们要求我们的系统管理员为*.abc.com而不是abc.com配置SSL证书,然后只需很少的代码更改,每次用户尝试登录时,他都会登录到一个带有随机子域名号码的标签中。因此每个选项卡都可以独立地拥有自己的会话。此外,为了避免任何冲突,我们使用用户id的散列或md5来开发随机数。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/368653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档