使用JSF 2.0/Facelets,有没有办法将全局侦听器附加到所有AJAX调用?

Jon*_*her 11 java ajax redirect listener jsf-2

有没有办法将全局侦听器附加到JSF中的所有AJAX调用?也许通过阶段听众或其他什么?

这是一个难题...让我们说你正在使用f:ajax标签和像apache shiro之类的东西,你让你的会话到期.然后你回来并点击一个附有f:ajax的按钮.服务器将以302重定向响应登录页面.

用户什么也看不见.他们可以反复点击并调用ajax调用,但对他们来说应用程序只是"死了".

所以,我的问题是,有没有办法将监听器附加到JSF中的所有ajax调用?如果是这样,我想做的是监控响应代码.如果是重定向,请使用window.navigate沿途发送它们.

我总是乐于听取其他人如何解决这个问题!

Bal*_*usC 18

有没有办法将全局侦听器附加到JSF中的所有AJAX调用?也许通过阶段听众或其他什么?

是的,一个人PhaseListener可以做到.一个SystemEventListener也.一个Filter也.

如果您在JSF上下文中,那么您可以检查当前请求是否是ajax请求,如下所示.

if (FacesContext.getCurrentInstance().getPartialViewContext().isAjaxRequest()) {
    // It's an ajax request.
}
Run Code Online (Sandbox Code Playgroud)

如果你不在JSF上下文中,例如在a里面Filter,那么你可以检查当前请求是否是JSF ajax请求.

if ("partial/ajax".equals(request.getHeader("Faces-Request"))) {
    // It's a JSF ajax request.
}
Run Code Online (Sandbox Code Playgroud)

这是一个难题...让我们说你正在使用f:ajax标签和像apache shiro之类的东西,你让你的会话到期.然后你回来并点击一个附有f:ajax的按钮.服务器将以302重定向响应登录页面.

用户什么也看不见.他们可以反复点击并调用ajax调用,但对他们来说应用程序只是"死了".

强制重定向ajax请求需要特殊的XML响应.当你在JSF上下文中时,ExternalContext#redirect()已经隐含地考虑了这一点.你需要做的就是写这个:

FacesContext.getCurrentInstance().getExternalContext().redirect(url);
Run Code Online (Sandbox Code Playgroud)

如果你不在JSF上下文中,例如在a里面Filter,那么你需要自己编写整个XML响应.例如

response.setContentType("text/xml");
response.getWriter()
    .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
    .printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>", url);
Run Code Online (Sandbox Code Playgroud)