【发布时间】:2011-05-18 18:11:17
【问题描述】:
我在 Spring 论坛中也有 posted this,但我想我会给这里的人们一个增加声誉的机会:
对于在集群环境中运行的普通旧 servlet 应用程序(会话复制/故障转移),如果会话属性已被修改,最好“重新设置”会话属性:
UserPreferences prefs = (UserPreferences)session.getAttribute("userPreferences");
prefs.setInstantEmail(true);
session.setAttribute("userPreferences", prefs);
这充当会话状态已更改并且需要复制的容器的标志。 Here's a reference 一些关于该主题的 WLS 文档。
我目前正在修改的一个应用程序使用 Spring 来支持 POJO+Injection 开发风格,我不清楚上述做法如何转化。根据 Spring 文档 Scoped beans as dependencies,该应用程序使用 <aop:scoped-proxy/> 注入会话范围的依赖项。但是,如果没有直接访问会话,如何将该依赖项的更改标记到容器以便进行复制?代理或网络上下文中是否有内置的东西来支持它?如果没有,有没有人举例说明他们是如何处理的?
感谢您的任何见解。
基于axtavt's answer的澄清:
遵循 POJO+Injection 方法的项目目标之一是避免直接依赖于 Java EE 或 Spring 类。我可以想象 Spring 可能会暴露一些钩子来从上下文中检索 bean,这可以提供一个位置来至少跟踪哪些会话范围的 bean 已被使用。另一种可能性可能是在会话范围的 bean 上声明一组方法,这些方法在调用时可能会触发状态更改。由于对 Spring 不是很熟悉,我只能在不了解技术细节的情况下猜测 似乎 的可能性。
查看一些 Spring 代码后的后续问题:
谁能解释ServletRequestAttributes 可能扮演的角色?看起来它的getAttribute 方法跟踪已检索到哪些属性,然后其updateAccessedSessionAttributes 方法尝试“重新设置”它认为已更改的属性。
【问题讨论】: