Java 使用JSF2.0/Facelets,有没有办法将全局侦听器附加到所有AJAX调用?

Java 使用JSF2.0/Facelets,有没有办法将全局侦听器附加到所有AJAX调用?,java,ajax,redirect,jsf-2,listener,Java,Ajax,Redirect,Jsf 2,Listener,有没有一种方法可以将全局侦听器附加到JSF中的所有AJAX调用?也许是通过一个相位监听器或其他什么 这是一个难题。。。假设您正在使用f:ajax标记和类似apacheshiro的东西,并且您让会话过期。然后返回并单击一个附加了f:ajax的按钮。服务器将响应302重定向到登录页面 用户什么也看不见。他们可以反复单击并调用ajax调用,但对他们来说,应用程序只是“死了” 那么,我的想法是,有没有一种方法可以将侦听器附加到JSF中的所有ajax调用?如果是这样,我想做的是监视响应代码。如果是重定向,

有没有一种方法可以将全局侦听器附加到JSF中的所有AJAX调用?也许是通过一个相位监听器或其他什么

这是一个难题。。。假设您正在使用f:ajax标记和类似apacheshiro的东西,并且您让会话过期。然后返回并单击一个附加了f:ajax的按钮。服务器将响应302重定向到登录页面

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

那么,我的想法是,有没有一种方法可以将侦听器附加到JSF中的所有ajax调用?如果是这样,我想做的是监视响应代码。如果是重定向,请使用window.navigate将其发送


我总是乐于听到别人是如何解决这个问题的

要重定向jsf ajax请求,需要xml,如下所示

<?xml version="1.0" encoding="UTF-8"?>   
<partial-response>  
      <redirect url="XXX">  
      </redirect>  
</partial-response>

这里XXX是您希望重定向的url

在ajax调用上发送的重定向与上述不同,因此没有重定向

为了得到期望的结果,除了少数几个请求之外,所有jsf请求都有一个过滤器 页面(登录页面)并检查会话是否有效,以及它是否真的是jsf ajax调用通过检查标题“FacesRequest”,其值应为 “部分/ajax”。如果会话已过期,是否在上面发送ajax请求 xml作为响应

它应该会起作用

有没有一种方法可以将全局侦听器附加到JSF中的所有AJAX调用?也许是通过一个相位监听器或其他什么

是的,a能做到。A也是。A也是

如果您在JSF上下文中,那么可以按如下方式检查当前请求是否是ajax请求

if (FacesContext.getCurrentInstance().getPartialViewContext().isAjaxRequest()) {
    // It's an ajax request.
}
if ("partial/ajax".equals(request.getHeader("Faces-Request"))) {
    // It's a JSF ajax request.
}
如果您不在JSF上下文中,例如在
过滤器中,那么您可以如下检查当前请求是否是JSF ajax请求

if (FacesContext.getCurrentInstance().getPartialViewContext().isAjaxRequest()) {
    // It's an ajax request.
}
if ("partial/ajax".equals(request.getHeader("Faces-Request"))) {
    // It's a JSF ajax request.
}

这是一个难题。。。假设您正在使用f:ajax标记和类似apacheshiro的东西,并且您让会话过期。然后返回并单击一个附加了f:ajax的按钮。服务器将响应302重定向到登录页面

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

对ajax请求强制重定向需要特殊的XML响应。当您在JSF上下文中时,就已经隐式地考虑了这一点。您只需写下以下内容:

FacesContext.getCurrentInstance().getExternalContext().redirect(url);
如果您不在JSF上下文中,例如在
过滤器中,那么您需要自己编写整个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);
response.setContentType(“text/xml”);
response.getWriter()
.附加(“”)
.printf(“,url”);

TSo我想最好的方法是编写一个位于Shiro过滤器前面的过滤器。当Shiro发送重定向时,我的过滤器将截获它并发送XML。我有一种感觉,我不能在faces应用程序中这样做,因为Shiro将阻止该请求。你最好的选择是在Shiro filter前面设置一个过滤器。为你提供信息,我在博客中详细介绍了这个案例,并为Shiro提供了一个完整的现成过滤器:这不是一个更好的解决方案,而不是所有这些黑客行为?我想知道为什么JSF还没有提供这一点&如果我能以某种方式实现这一点的话?我想知道为什么JSF还没有提供这一点&如果我能以某种方式实现这一点的话。