在标签之间共享会话

时间:2011-06-05 13:26:19

标签: jsp session java-ee browser-tab

我有JAVA Web应用程序,我需要停止在浏览器选项卡之间共享会话,这意味着

用户打开浏览器,登录他的帐户并在同一浏览器的新标签页中打开特定页面。根据默认设置,会话将共享到新选项卡,用户将自动登录到新选项卡。任何人都可以告诉我这是如何停止的,所以我至少可以在几个敏感页面中限制它,如果不是整个应用程序。

2 个答案:

答案 0 :(得分:8)

通常cookie用于会话处理。然后所有选项卡和浏览器窗口共享同一会话。但您可以将servlet容器配置为使用URL重写而不是cookie。 (这是example for Jetty。)

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

使用URL重写,可以在同一浏览器实例的不同窗口或选项卡中包含多个独立会话。

<强>更新 为了回应downvote,我想弄清楚URL重写的不同行为:

我们假设网站的网址为http://webapp.com

<强>饼干: 在第一个浏览器标签中打开http://webapp.com

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

浏览器存储cookie。

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

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

网址重写 在第一个浏览器标签中打开http://webapp.com

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

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

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

所以你在同一个浏览器中有两个独立的会话。

答案 1 :(得分:0)

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