旧代码在ServletFilter中的第一个请求中创建@SessionScoped @ManagedBean
(即UserSession
)并将其放入HttpSession
(如果尚未存在)。
现在当一些EL表达式第一次尝试访问ManagedBean时会发生什么?我期待UserSession
的第二个实例(一个手动创建,一个来自JSF)。所以我使用一些日志记录语句对构造函数@PostConstruct
和@PreDestroy
进行了检测。现在似乎JSF从未创建UserSession
- 只调用构造函数。
这可能吗? JSF可以从HttpSession
重用该bean吗?将@SessionScoped
bean放在HttpSession
中是否合法?
答案 0 :(得分:2)
你的观察是正确的。在JSF的封面下,JSF本身也将会话范围的托管bean存储为HttpSession
的属性。因此,如果它已经存在,它将被重用,无论它最终如何结束。
这种好坏取决于具体的功能要求。鉴于你的惊讶,我猜这很糟糕,你需要修改方法或功能要求。也许你需要一个辅助(会话作用域?)托管bean,它通过@ManagedProperty
注入特定的会话属性。