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

前端之家收集整理的这篇文章主要介绍了java – 使用JSF 2.0 / Facelets,有没有办法将全局监听器附加到所有AJAX调用?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有办法将全局监听器附加到JSF中的所有 AJAX调用?也许是通过一个阶段的听众呢?

这是难题…让我们说你使用f:ajax标签和apache shiro,你让你的会话过期.然后你回来点击一个附有f:ajax的按钮.服务器将通过302重定向登录页面进行响应.

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

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

我总是乐意听到其他人如何解决这个问题!
谢谢!

解决方法

Is there a way to attach a global listener to all AJAX calls in JSF? Maybe through a phase listener or something?

是的,PhaseListener可以做到. A SystemEventListener也. A Filter也.

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

if (FacesContext.getCurrentInstance().getPartialViewContext().isAjaxRequest()) {
    // It's an ajax request.
}

如果你不在JSF上下文,例如在一个过滤器中,那么可以检查当前的请求是否是JSF ajax请求.

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

Here is the conundrum… Lets say you’re using f:ajax tags and something like apache shiro and you let your session expire. Then you come back and click a button that has an f:ajax attached to it. The server will respond with a 302 redirect to the login page.

The user sees nothing. They can repeatedly click and invoke the ajax call,but to them the app is just “dead.”

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

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);
原文链接:https://www.f2er.com/java/122620.html

猜你在找的Java相关文章