gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:19:34 25 4
gpt4 key购买 nike

有没有办法将全局监听器附加到 JSF 中的所有 AJAX 调用?也许通过相位监听器或其他方式?

这就是难题...假设您正在使用 f:ajax 标签和 apache shiro 之类的东西,并且您让 session 过期。然后您返回并单击一个附加了 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可以做到。 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.
}

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 上下文中,例如在 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);

关于java - 使用 JSF 2.0/Facelets,有没有办法将全局监听器附加到所有 AJAX 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9305144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com