2

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

提前谢谢...

4

1 回答 1

1

JSF 将会话范围的托管 bean 存储为 的属性HttpSession,而后者又仅在Filterby中可用HttpServletRequest#getSession()

HttpSession session = ((HttpServletRequest) request).getSession();
SessionBean sessionBean = session.getAttribute("sessionBean");
// ...

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

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

我知道您使用的是 JSF 自己@ManagedBean的,最初的答案仅适用于此。如果您的 bean 已经由 CDI 管理@Named,那么只需@InjectFilter.

@Inject
private SessionBean sessionBean;

如果是 JSF @ManagedBean,您应该只添加一个if (sessionBean != null)检查。过滤器是否在 JSF servlet 之前调用无关紧要。一旦 JSF 创建了会话 bean,它就不会出现null在过滤器中。

于 2012-06-11T18:49:56.807 回答