[英]How could I read a JSF session bean from a filter?
我正在搜索,但找不到答案,我需要基于权限的安全资源,我无法使用过滤器,因为FacesContext之前未初始化,因此我需要在会话bean中加载权限。 一些避免使用过滤器的解决方案? PhaseListener,ViewHandler和ResourceHandler无法捕获URL资源请求,例如,我需要拒绝此直接访问: http://127.0.0.1:8080/test/resources/images/image.jpg
: http://127.0.0.1:8080/test/resources/images/image.jpg
: http://127.0.0.1:8080/test/resources/images/image.jpg
test/resources/images/ http://127.0.0.1:8080/test/resources/images/image.jpg
提前谢谢...
JSF将会话范围内的受管bean作为HttpSession
的属性存储,而HttpServletRequest#getSession()
可以在Filter
使用该属性。
HttpSession session = ((HttpServletRequest) request).getSession();
SessionBean sessionBean = session.getAttribute("sessionBean");
// ...
更新 :根据您似乎实际上在使用CDI的注释:
我的过滤器比JSF之前触发,当我使用getAttribute时总是得到一个空值。 我在Bean上使用带有“命名”和“ SessionScoped”注释的CDI,因为我需要使用拦截器来实现安全性
我知道您使用的是JSF自己的@ManagedBean
,最初的答案仅适用@ManagedBean
。 如果您的bean已经由CDI的@Named
管理,那么只需在Filter
以通常的方式使用CDI自己的@Inject
。
@Inject
private SessionBean sessionBean;
如果是JSF @ManagedBean
,则应仅添加if (sessionBean != null)
检查。 是否在JSF servlet之前调用过滤器是无关紧要的。 JSF创建了会话bean之后,它在过滤器中就不会为null
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.