JSF中的拦截器

use*_*297 8 jsf interceptor jsf-2

我想知道JSF中是否有拦截器(就像我们在Spring中使用的那样),以及如何实现它?

Bal*_*usC 10

你可以PhaseListener为此实现一个.您可以对它们进行编程以侦听您在重写方法中指定的特定JSF阶段getPhaseId().您可以通过beforePhase()afterPhase()方法拦截前后阶段事件.

下面的示例侦听渲染响应阶段:

public class RequestInterceptor implements PhaseListener {

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
    }

    @Override
    public void beforePhase(PhaseEvent event) {
        // Do your job here which should run before the render response phase.
    }

    @Override
    public void afterPhase(PhaseEvent event) {
        // Do your job here which should run after the render response phase.
    }

}
Run Code Online (Sandbox Code Playgroud)

为了得到它的运行,你需要将其注册为一个<phase-listener><life-cycle>一节的faces-config.xml文件.你可以有多个<phase-listener>s.

<lifecycle>
    <phase-listener>com.example.RequestInterceptor</phase-listener>
</lifecycle>
Run Code Online (Sandbox Code Playgroud)

您可以指定PhaseId.ANY_PHASEgetPhaseId()让每一个JSF阶段运行阶段监听器(注意,不一定所有的人就一定会执行,这取决于请求类型).如有必要,您可以在前后阶段方法中获取当前阶段ID PhaseEvent#getPhaseId().

public class PhaseDebugger implements PhaseListener {

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.ANY_PHASE;
    }

    @Override
    public void beforePhase(PhaseEvent event) {
        System.out.println("Before phase " + event.getPhaseId());
    }

    @Override
    public void afterPhase(PhaseEvent event) {
        System.out.println("After phase " + event.getPhaseId());
    }

}
Run Code Online (Sandbox Code Playgroud)

或者,Filter如果你想要一个更全局的钩子,那么a 应该同样有效(因此你对JSF请求/响应并不完全感兴趣而且你不需要任何东西FacesContext).

@WebFilter("/*")
public class RequestInterceptor implements Filter {

    @Override
    public void init(FilterConfig config) {
        // Initialize global variables if necessary.
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        // Do your job here which should run before the request processing.
        chain.doFilter(request, response);
        // Do your job here which should run after the request processing.
    }

    @Override
    public void destroy() {
        // Cleanup global variables if necessary.
    }

}
Run Code Online (Sandbox Code Playgroud)