有没有办法将全局侦听器附加到JSF中的所有AJAX调用?也许通过相位监听器之类的东西?
这是一个难题……假设您正在使用f:ajax标记和apache shiro之类的东西,并且您的会话将过期。然后,您返回并单击附加了f:ajax的按钮。服务器将响应302重定向到登录页面。
用户什么都看不到。他们可以反复单击并调用ajax调用,但对他们来说,该应用程序只是“死”。
所以,尽管如此,是否有办法将侦听器附加到JSF中的所有ajax调用中?如果是这样,我想做的就是监视响应代码。如果是重定向,请使用window.navigate沿其发送。
我总是乐于听到别人如何解决这个问题!
有没有办法将全局侦听器附加到JSF中的所有AJAX调用? 也许通过相位监听器之类的东西?
是的,一个PhaseListener可以做到。一SystemEventListener也。一Filter也。
PhaseListener
SystemEventListener
Filter
如果您在JSF上下文中,则可以按以下方法检查当前请求是否为ajax请求。
if (FacesContext.getCurrentInstance().getPartialViewContext().isAjaxRequest()) { // It's an ajax request. }
如果您不在JSF上下文内,例如在内Filter,则可以按以下方法检查当前请求是否为JSF ajax请求。
if ("partial/ajax".equals(request.getHeader("Faces-Request"))) { // It's a JSF ajax request. }
这是一个难题……假设您正在使用f:ajax标记和apache shiro之类的东西,并且您的会话将过期。 然后,您返回并单击附加了f:ajax的按钮。服务器将响应302重定向到登录页面。 用户什么都看不到。 他们可以反复单击并调用ajax调用,但对他们来说,该应用程序只是“死”。
这是一个难题……假设您正在使用f:ajax标记和apache shiro之类的东西,并且您的会话将过期。 然后,您返回并单击附加了f:ajax的按钮。服务器将响应302重定向到登录页面。
用户什么都看不到。 他们可以反复单击并调用ajax调用,但对他们来说,该应用程序只是“死”。
强制对ajax请求进行重定向需要特殊的XML响应。当您在JSF上下文中时,ExternalContext#redirect()已经隐式考虑了这一点。您所需要做的就是编写以下代码:
ExternalContext#redirect()
FacesContext.getCurrentInstance().getExternalContext().redirect(url);
如果您不在JSF上下文之内,例如在之中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);