我正在搜索但找不到答案,我需要基于权限的安全资源,我不能使用过滤器,因为 FacesContext 之前没有初始化,我需要在我的会话 bean 中加载权限。一些避免使用过滤器的解决方案?PhaseListener、ViewHandler 和 ResourceHandler 无法捕获 URL 资源请求,例如我需要拒绝此直接访问:http://127.0.0.1:8080/test/resources/images/image.jpg
提前谢谢...
我正在搜索但找不到答案,我需要基于权限的安全资源,我不能使用过滤器,因为 FacesContext 之前没有初始化,我需要在我的会话 bean 中加载权限。一些避免使用过滤器的解决方案?PhaseListener、ViewHandler 和 ResourceHandler 无法捕获 URL 资源请求,例如我需要拒绝此直接访问:http://127.0.0.1:8080/test/resources/images/image.jpg
提前谢谢...
JSF 将会话范围的托管 bean 存储为 的属性HttpSession
,而后者又仅在Filter
by中可用HttpServletRequest#getSession()
。
HttpSession session = ((HttpServletRequest) request).getSession();
SessionBean sessionBean = session.getAttribute("sessionBean");
// ...
更新:根据您似乎实际上在使用 CDI 的评论:
我的过滤器在 JSF 之前触发,当我使用 getAttribute 时总是得到一个空值。我在我的 Bean 上使用带有“Named”和“SessionScoped”注释的 CDI,因为我需要使用拦截器来实现安全性
我知道您使用的是 JSF 自己@ManagedBean
的,最初的答案仅适用于此。如果您的 bean 已经由 CDI 管理@Named
,那么只需@Inject
在Filter
.
@Inject
private SessionBean sessionBean;
如果是 JSF @ManagedBean
,您应该只添加一个if (sessionBean != null)
检查。过滤器是否在 JSF servlet 之前调用无关紧要。一旦 JSF 创建了会话 bean,它就不会出现null
在过滤器中。