Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 在JSF2中,在何处放置类似过滤器的逻辑_Jsf 2_Java Ee 6_Cdi - Fatal编程技术网

Jsf 2 在JSF2中,在何处放置类似过滤器的逻辑

Jsf 2 在JSF2中,在何处放置类似过滤器的逻辑,jsf-2,java-ee-6,cdi,Jsf 2,Java Ee 6,Cdi,我目前正在绞尽脑汁,想在我的Java EE 6/JSF 2 webapp中为一些授权内容提供一个通用逻辑: 我有一个要求,所有带有特定cookie的请求都应该重定向到另一个页面 我考虑了3种解决方案: 1)使用servlet 3.0过滤器(@WebFilter) 这是可行的,我也可以在那里注入我的托管bean,但是托管bean需要访问faces externalContext,它在过滤器调用时还没有设置,所以我得到了NPE调用托管bean的消息 2)使用相位侦听器 这感觉很尴尬,因为相位侦听器不

我目前正在绞尽脑汁,想在我的Java EE 6/JSF 2 webapp中为一些授权内容提供一个通用逻辑: 我有一个要求,所有带有特定cookie的请求都应该重定向到另一个页面

我考虑了3种解决方案:

1)使用servlet 3.0过滤器(@WebFilter) 这是可行的,我也可以在那里注入我的托管bean,但是托管bean需要访问faces externalContext,它在过滤器调用时还没有设置,所以我得到了NPE调用托管bean的消息

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

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

在seam中,这看起来像:

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


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

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

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


这或多或少相当于Seam 2页面操作(不过您必须过滤掉回发)。您可以使用CDI扩展进一步增强默认行为,如。如果您看一下文档,看看什么适合您的需要,这可能是一个好主意。

嗨,jan,谢谢您的快速回答,我不知道该功能!因此,如果我想确保所有jsf页面都被截获,唯一的方法就是确保所有jsf页面都包含这段代码(例如,通过页面合成)?不,这肯定不是唯一的方法。如果我是你的话,我会进一步研究过滤器选项——因为这是许多JSF应用程序的标准要求,所以肯定会有一个复杂的解决方案来解决你的问题。