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