我有JAVA web应用程序,需要停止浏览器选项卡之间共享的会话,即
用户打开浏览器,登录到他的帐户,并在同一浏览器的新选项卡中打开特定页面。根据默认设置,会话被共享到新选项卡,用户会自动登录到新选项卡。有人能告诉我如何停止这一操作吗?这样,如果不是整个应用程序,我至少可以在几个敏感页面中限制这一操作。
通常cookie用于会话处理。然后,所有选项卡和浏览器窗口共享同一会话。但是您可以将servlet容器配置为使用URL重写而不是cookie。(这是Jetty的一个例子。)
使用URL重写,会话只能通过包含会话ID的URL参数来识别。因此,必须使用方法HttpServletResponse.encodeURL()
使用该参数来增强web应用程序的每个内部URL。如果你正在使用像Wicket这样的web框架,那么很有可能这已经为你完成了。
通过URL重写,可以在同一浏览器实例的不同窗口或选项卡中有几个独立的会话。
更新:作为对否决票的回应,我想明确URL重写的不同行为:
假设网站的URL为http://webapp.com.
Cookie:打开http://webapp.com在第一个浏览器选项卡中。
服务器创建一个会话,并在响应中发送一个cookie。
浏览器存储cookie。
然后打开http://webapp.com在第二个浏览器选项卡中。浏览器将此URL与最近存储的cookie相关联,并将cookie添加到请求中。
对于服务器,来自第一或第二浏览器选项卡的请求与来自同一会话的响应之间没有区别。有时,这是人们想要的行为。
URL重写:打开http://webapp.com在第一个浏览器选项卡中。
服务器创建一个ID为1的会话,并将参数jsessionid=1添加到响应页面中的每个URL。未传输cookie。
从第一个浏览器选项卡对同一网络应用程序的另一个页面的所有进一步请求都包括会话ID(对于示例1)。
然后打开http://webapp.com从第二个浏览器选项卡。这里有区别由于请求中没有cookie和jsessionid参数,服务器会创建一个新会话(即ID 2),并将参数jsessionid=2添加到响应页面中包含的每个URL中。从现在起,来自第二浏览器选项卡的所有后续请求都与会话2相关联。
因此,在同一个浏览器中有两个独立的会话。
如果您正在使用javascript,我可以为您提供一个解决方案。a) 在登录屏幕中有一个隐藏参数,为该隐藏字段设置窗口名称b) 当你登录(提交请求)时,在操作类中检查请求参数是否为空,是否等于登录页,这是一个有效的请求,意味着通过登录合并到登录页,如果没有重定向到无效页。