【问题标题】:How could I read a JSF session bean from a filter?如何从过滤器中读取 JSF 会话 bean?
【发布时间】:2012-06-14 16:16:41
【问题描述】:

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

提前谢谢...

【问题讨论】:

    标签: security jsf resources servlet-filters cdi


    【解决方案1】:

    JSF 将会话范围的托管 bean 存储为 HttpSession 的一个属性,而 HttpServletRequest#getSession() 又可以在 Filter 中使用它。

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

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

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

    我了解到您使用的是 JSF 自己的 @ManagedBean,最初的答案仅适用于此。如果您的 bean 已经由 CDI 的 @Named 管理,那么只需在 Filter 中使用 CDI 自己的 @Inject

    @Inject
    private SessionBean sessionBean;
    

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

    【讨论】:

    • 我的过滤器在 JSF 之前被触发,当我使用 getAttribute 时总是得到一个空值。我在我的 Bean 上使用带有“Named”和“SessionScoped”注释的 CDI,因为我需要使用拦截器来实现安全性。
    • 我更新了答案。我没想到您会使用 CDI,因为它在 CDI 中非常简单。
    • 好的,我删除了我的评论... CDI 与抽象类合作...你是最好的...谢谢... =)
    • 抱歉我的无知,但 Kab 究竟是如何拦截localhost:8080/test/resources/images/image.jpg 的呢? :-(
    • @Leo:使用Filter
    猜你喜欢
    • 2023-03-04
    • 2013-01-05
    • 2015-04-30
    • 2013-02-13
    • 2013-09-05
    • 2011-12-10
    • 1970-01-01
    • 2013-03-15
    • 2011-09-18
    相关资源
    最近更新 更多