如何从过滤器中读取 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何从过滤器中获取 SessionScoped CDI bean?