有没有办法将全局侦听器附加到JSF中的所有AJAX调用?也许通过阶段听众或其他什么?
这是难题......让我们说你正在使用f:ajax标签和类似apache shiro之类的东西,你让你的会话到期。然后你回来并点击一个附有f:ajax的按钮。服务器将以302重定向响应登录页面。
用户什么也看不见。他们可以反复点击并调用ajax调用,但对他们来说应用程序只是“死了”。
所以,我的问题是,有没有办法将侦听器附加到JSF中的所有ajax调用?如果是这样,我想做的是监控响应代码。如果是重定向,请使用window.navigate一路发送。
我总是乐于听取其他人如何解决这个问题!
答案 0 :(得分:18)
有没有办法将全局侦听器附加到JSF中的所有AJAX调用?也许通过阶段监听器或什么?
是的,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调用,但对他们来说应用程序只是“死了”。
强制对ajax请求进行重定向需要特殊的XML响应。当你在JSF上下文中时,ExternalContext#redirect()
已经隐含地考虑了这一点。你需要做的就是写下这个:
FacesContext.getCurrentInstance().getExternalContext().redirect(url);
如果您不在JSF上下文中,例如在Filter
内,您需要自己编写整个XML响应。 E.g。
response.setContentType("text/xml");
response.getWriter()
.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
.printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>", url);
答案 1 :(得分:4)
要重定向jsf ajax请求,您需要xml,如下所示
<?xml version="1.0" encoding="UTF-8"?>
<partial-response>
<redirect url="XXX">
</redirect>
</partial-response>
此处XXX是您希望重定向发生的网址。
在ajax调用重定向上发送的内容不如上所述,因此没有重定向。
要获得所需的结果,请为所有jsf请求设置一个过滤器,除了少数 页面(登录页面)和检查会话是有效的,如果它真的是jsf ajax调用通过检查标题“Faces-Request”,其值应该是 “局部/ AJAX”。如果会话已过期并且是上面发送的ajax请求 xml作为回应。
它应该工作。