如何从过滤器中读取 JSF 会话 bean?

Posted

技术标签:

【中文标题】如何从过滤器中读取 JSF 会话 bean?【英文标题】:How could I read a JSF session bean from a filter? 【发布时间】:2012-06-14 16:16:41 【问题描述】:

我正在搜索,但找不到答案,我需要基于权限的安全资源,我不能使用过滤器,因为 FacesContext 之前没有初始化,我需要在我的会话 bean 中加载权限。一些避免使用过滤器的解决方案? PhaseListener、ViewHandler 和 ResourceHandler 无法捕获 URL 资源请求,例如我需要拒绝此直接访问:http://127.0.0.1:8080/test/resources/images/image.jpg

提前谢谢...

【问题讨论】:

【参考方案1】:

JSF 将会话范围的托管 bean 存储为 HttpSession 的一个属性,而 HttpServletRequest#getSession() 又可以在 Filter 中使用它。

HttpSession session = ((HttpServletRequest) request).getSession();
SessionBean sessionBean = session.getAttribute("sessionBean");
// ...

更新:根据评论,您似乎实际上在使用 CDI:

我的过滤器在 JSF 之前被触发,当我使用 getAttribute 时总是得到一个空值。我在我的 Bean 上使用带有 'Named' 和 'SessionScoped' 注释的 CDI,因为我需要使用拦截器来实现安全性

我了解到您使用的是 JSF 自己的 @ManagedBean,最初的答案仅适用于此。如果您的 bean 已经由 CDI 的 @Named 管理,那么只需在 Filter 中使用 CDI 自己的 @Inject

@Inject
private SessionBean sessionBean;

如果是 JSF @ManagedBean,您应该只添加一个 if (sessionBean != null) 检查。过滤器是否在 JSF servlet 之前调用无关紧要。一旦会话 bean 由 JSF 创建,过滤器中就不会是 null

【讨论】:

我的过滤器在 JSF 之前被触发,当我使用 getAttribute 时总是得到一个空值。我在我的 Bean 上使用带有“Named”和“SessionScoped”注释的 CDI,因为我需要使用拦截器来实现安全性。 我更新了答案。我没想到您会使用 CDI,因为它在 CDI 中非常简单。 好的,我删除了我的评论... CDI 与抽象类合作...你是最好的...谢谢... =) 抱歉我的无知,但 Kab 究竟是如何拦截localhost:8080/test/resources/images/image.jpg 的呢? :-( @Leo:使用Filter

以上是关于如何从过滤器中读取 JSF 会话 bean?的主要内容,如果未能解决你的问题,请参考以下文章

JSF 登录过滤器,会话为空

如何从过滤器中获取 SessionScoped CDI bean?

JSF Managed Beans 不使用 spring 安全过滤器

JSF 页面不使用过滤器接口重定向

从 JSF 请求中检索会话 ID 值

如何在 JSF 中正确使用组件绑定? (会话范围 bean 中的请求范围组件)