我怎么能从过滤器中读取JSF会话bean?

时间:2012-06-11 18:25:46

标签: security jsf resources servlet-filters cdi

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

提前......

1 个答案:

答案 0 :(得分:1)

JSF将会话范围的托管bean存储为HttpSession的属性,而Filter只能HttpServletRequest#getSession()提供HttpSession session = ((HttpServletRequest) request).getSession(); SessionBean sessionBean = session.getAttribute("sessionBean"); // ...

@ManagedBean

更新:根据您似乎实际使用CDI的评论:

  

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

我知道您使用的是JSF自己的@Named,初步答案仅适用于此。如果您的bean已经由CDI的@Inject管理,那么只需在Filter中使用CDI自己的@Inject private SessionBean sessionBean;

@ManagedBean

如果是JSF if (sessionBean != null),您只需添加null项检查。是否在JSF servlet之前调用过滤器是无关紧要的。一旦JSF创建了会话bean,它就不会是过滤器中的{{1}}。