在不使用会话上下文的情况下在web应用程序中持久化值



我有一个"变量",用户可以在JSP/Struts应用程序中修改它,它必须在整个web应用程序的会话中持久化。他们可能会离开设置和查看变量的页面(仍然留在应用程序中),当他们返回时,他们上次为该变量设置的值应该仍然存在。

显而易见的选择是将其存储为会话属性。这就是我几年前会做的事。但是Internet Explorer 8及更高版本会导致web应用程序用户对同一网站上打开的所有浏览器都有一个会话。换句话说,如果用户在浏览器中打开我的应用程序,然后在另一个浏览器中第二次打开它,他们共享一个会话。我认为他们正在共享代表该会话的cookie。结果是,如果他们在一个浏览器的会话中更改了值,那么该值也将在另一个浏览器中更改。

我的用户将在一个工作站上多次运行web应用程序,我需要他们能够在不同的浏览器窗口(甚至选项卡)中为上述变量设置不同的值,并使不同的值在浏览器(或选项卡)的使用寿命内保持,但不影响同一应用程序的任何其他打开的浏览器(或标签)。

因此,据我所知,使用会话属性是不可能的。(有IE-nomerge选项,但没有办法强迫用户使用该选项启动IE)。

我希望我不是第一个处理这个问题的人,有人优雅地解决了这个问题,那个人读了这篇文章并做出了回应。

如果不同的选项卡或窗口都发送相同的会话id,服务器就无法区分它们。但是,如果您需要这种功能,我会考虑将"差异"构建到URL中。例如,一个选项卡可能有/myapp/xxxxx/,而另一个选项卡则可能有/miapp/yyyy/。两者可能共享同一会话,但服务器仍然可以区分它们。URL的实际格式并不重要,只要浏览器总是在某个地方返回神奇的部分(例如:xxxxx)。在服务器端,您可以根据sessionid和发出请求的URL跟踪每个会话的多个数字。

唯一要决定的是如何注意到新的选项卡或窗口已经打开,因为你必须分配一个新的URL,但这只是管道。例如,您可以有一个本地js变量,该变量需要设置为与URL匹配,然后当一个新选项卡打开时,该变量将不匹配,因此您可以转到一个新的适当URL并设置本地变量。

最新更新