【问题标题】:where to put filter like logic in JSF2在 JSF2 中将过滤器逻辑放在哪里
【发布时间】:2012-04-18 00:27:04
【问题描述】:

我目前正在思考如何在我的 Java EE 6/JSF 2 webapp 中为一些授权内容放置通用逻辑: 我有一个要求,所有带有特定 cookie 的请求都应该重定向到另一个页面。

我考虑了 3 个解决方案:

1) 使用 servlet 3.0 过滤器 (@WebFilter) 这行得通,我也可以在那里注入我的托管 bean,但是托管 bean 需要访问外部上下文,在过滤器调用时尚未设置,所以我得到 NPE 调用托管 bean

2) 使用相位监听器 这感觉很尴尬,因为相位监听器不能是 CDI 组件,因此不能注入其他组件(通过 el 评估除外);对我来说,一个 phaseListener 感觉在技术上将导航逻辑放入其中。

3) 在 Seam 2.0 中,我可以使用“页面操作” 来处理类似的事情,但似乎这个概念并没有融入 JSF 2.0

在接缝中看起来像:

<page view-id="/admin/*.jsf">
    <action execute="#{authenticator.checkAccess()}" />
</page>

JSF 2.0 真的没有在渲染页面之前执行“控制器逻辑”的概念吗?

【问题讨论】:

    标签: jsf-2 java-ee-6 cdi


    【解决方案1】:

    在 JSF 2.x 中,您可以像这样监听页面事件:

    <f:metadata>
       <f:event type="javax.faces.event.PreRenderViewEvent" listener="#authenticator.checkAccess()}" />
    </f:metadata>
    

    这或多或少等同于 Seam 2 页面操作(尽管您必须过滤掉回发)。您可以使用 Seam Faces 等 CDI 扩展进一步增强默认行为。如果您查看文档并了解适合您的需求,这可能是一个好主意...

    【讨论】:

    • 你好,谢谢你的快速回答,不知道这个功能!所以,如果我想确保我的所有 jsf 页面都被拦截,唯一的方法是确保所有 jsf 页面都包含那段代码(例如通过页面组合)?
    • 不不,这当然不是唯一的方法。如果我是你,我会在过滤器选项中进一步调查 - 因为这是许多 JSF 应用程序的标准要求,所以你的问题肯定应该有一个复杂的解决方案。
    猜你喜欢
    • 2014-03-16
    • 1970-01-01
    • 2012-01-22
    • 2013-07-26
    • 2016-03-08
    • 2011-09-08
    • 1970-01-01
    • 2015-01-22
    • 2011-08-02
    相关资源
    最近更新 更多