2011-06-05 112 views
7

我的Java Web应用程序,我需要停止浏览器标签页之间共享会话之间,这就意味着会话共享的标签

用户打开浏览器,登录到自己的帐户,并在新标签中打开特定网页同一浏览器。根据默认设置,会话将被分享到新标签页,并且用户将自动登录到新标签页。任何人都可以告诉我们如何阻止这种情况发生,所以我至少可以将它限制在少数敏感页面中,如果不是整个应用程序。

+1

可能重复的[如何区分浏览器选项卡中的会话?](http://stackoverflow.com/questions/368653/how-to-differ-sessions-in-browser-tabs) – 2011-06-05 13:33:17

+0

您是否正在使用javascript in你的应用程序 – developer 2012-07-25 07:03:13

回答

8

Cookie通常用于会话处理。然后,所有选项卡和浏览器窗口共享相同的会话。但是你可以配置你的servlet容器来使用URL重写而不是cookies。 (这是一个example for Jetty。)

通过URL重写,会话只能通过包含会话ID的URL参数标识。因此,您的Web应用程序的每个内部URL都必须使用此方法使用方法HttpServletResponse.encodeURL()进行增强。如果你使用Wicket这样的web框架,很可能已经为你完成了。

通过URL重写,可以在同一浏览器实例的不同窗口或选项卡中拥有多个独立会话。

更新: 针对我要明确URL重写的不同行为downvote:

假设该网站的网址是http://webapp.com

Cookies: 在第一个浏览器选项卡中打开http://webapp.com

服务器创建一个会话并在响应中发送一个cookie。

浏览器存储cookie。

然后在第二个浏览器选项卡中打开http://webapp.com。浏览器将此URL与最近存储的Cookie相关联,并将Cookie添加到请求中。

对于服务器,来自第一个或第二个浏览器选项卡的请求与来自同一个会话的响应没有区别。有时这是所期望的行为。

URL重写: 在第一个浏览器选项卡中打开http://webapp.com

服务器创建ID为1的会话,并将参数jsessionid = 1添加到响应页面中的每个URL。没有传送cookie。

从第一个浏览器选项卡到同一webapp的另一个页面的所有进一步请求都包括会话ID(例如1)。

然后从第二个浏览器选项卡打开http://webapp.com以下是区别!由于请求中没有cookie和jsessionid参数,服务器会创建一个新会话(即ID 2),并将参数jsessionid = 2添加到响应页面中包含的每个URL。从现在起,来自第二个浏览器选项卡的所有后续请求都与会话2相关联。

因此,您在同一浏览器中有两个独立会话。

+0

-1。在URL中对会话标识进行编码除了在没有cookie的情况下使客户端可用会话标识之外,什么也不做。 Cookie不会跨标签更改,也不会更改会话标识,从而导致URL编码的会话ID跨标签保持不变。 – 2011-06-05 21:54:34

+0

Cookie和URL重写有所不同。看到我更新的答案。 – vanje 2011-06-06 12:02:19

+1

当用户打开第一个选项卡的链接或复制新选项卡中第一个选项卡的URL时,仍然存在问题。 – BalusC 2011-06-06 12:13:25

0

如果您使用的是JavaScript,我可以为您提供一种解决方法。 a)在登录界面有一个隐藏参数,为该隐藏域设置windowname b)当您登录(提交请求)时,在action类中检查请求参数是否为空且等于登录页面,它的有效请求,意味着通过登录来登录页面,如果没有重定向到无效页面。