在 Web 过滤器中访问会话范围的 JSF 托管 bean
Posted
技术标签:
【中文标题】在 Web 过滤器中访问会话范围的 JSF 托管 bean【英文标题】:Access session scoped JSF managed bean in web filter 【发布时间】:2013-01-05 21:15:52 【问题描述】:我有一个名为 userSession 的 SessionScoped bean 来跟踪用户(用户名、ifLogged 等)。我想过滤一些页面,因此我需要从我创建的 webFilter 访问 bean。我怎么做?我看起来甚至不可能将 bean 导入潜在地可见。
【问题讨论】:
相关:How can I get session scoped bean in filter from session? (jsf 2.1) 【参考方案1】:在幕后,JSF 将会话范围的托管 bean 存储为 HttpSession
的属性,托管 bean 名称作为键。
所以,只要你有一个 @ManagedBean @SessionScoped public class User
,就应该在 doFilter()
方法中这样做:
HttpSession session = ((HttpServletRequest) request).getSession(false);
User user = (session != null) ? (User) session.getAttribute("user") : null;
if (user != null && user.isLoggedIn())
// Logged in.
或者,如果您实际上是使用 CDI 而不是 JSF 来管理 bean,那么只需在过滤器中直接使用 @Inject
。
另见:
Get JSF managed bean by name in any Servlet related class Prevent accessing restricted page without login in Jsf2【讨论】:
我能告诉你什么@BalusC 你应该被授予 JSF 硕士。 @BalusC:如果不调用该 bean 上的方法,我如何检查 CDI 注入(会话)bean 是否已被实例化(如果它不存在,它将创建 bean) ?session.getAttribute(<userBean>)
不适用于 CDI。谢谢。【参考方案2】:
作为替代方案,您可以使用 CDI-bean 并正常注入 sessionbean。
【讨论】:
以上是关于在 Web 过滤器中访问会话范围的 JSF 托管 bean的主要内容,如果未能解决你的问题,请参考以下文章
JSF 2.x @ViewScoped 托管 bean 线程安全吗?
在 servlet 过滤器中设置托管 Bean 的值。 [关闭]
JSF 2.0 在整个会话中从浏览器和以编程方式设置区域设置 [重复]