我有一个“变量”,用户可以在JSP / Struts应用程序中进行修改,该变量必须在整个Web应用程序会话中保持不变。他们可能会离开设置和查看页面的页面(仍然停留在应用程序中),并且当它们返回值时,它们最后一次为该变量设置的值仍然应该存在。
显而易见的选择是将其存储为会话属性。那就是我几年前要做的。但是Internet Explorer 8和更高版本会导致Web应用程序用户为在同一站点打开的所有浏览器进行一个会话。换句话说,如果用户在浏览器中打开我的应用程序,然后在另一个浏览器中再次打开它,则他们共享一个会话。我想他们正在共享代表该会话的cookie。结果是,如果他们在一个浏览器的会话中更改了该值,那么该值也将在另一浏览器中被更改。
我的用户将在单个工作站上多次运行该Web应用程序,我需要他们能够在其不同的浏览器窗口(甚至标签)中为上述变量设置不同的值,并为此保留不同的值浏览器(或标签)的生存期,但不会影响到同一应用程序的任何其他打开的浏览器(或标签)。
因此,据我所知,使用会话属性是不可能的。(有IE -nomerge选项,但是无法强制用户使用该选项启动IE)。
我希望我不是第一个处理此问题的人,并且那里的某个人已经优雅地解决了该问题,然后那个人阅读了这篇文章并做出了回应。
如果服务器的所有选项卡或窗口都发送回相同的会话ID,则无法区分它们。但是,如果您需要那种功能,那么我会考虑在URL中建立“差异”。例如,一个选项卡可能具有/ myapp / xxxxx /,而另一个选项卡可能具有/ myapp / yyyyy /。可能会共享同一个会话,但是服务器仍可以区分它们。URL的实际格式并不十分重要,只要浏览器始终在某个地方返回魔术部分(例如:xxxxx)即可。在服务器端,您可以根据sessionid和发出请求的URL跟踪每个会话的多个号码。
唯一要决定的就是您如何注意到新标签页或窗口已打开,因为您必须分配一个新URL,但这仅仅是一个问题。例如,您可能有一个本地js变量,需要将其设置为与URL匹配,然后在打开新标签页时此变量将不匹配,因此您可以转到新的适当的URL并设置本地变量。