我的GWT应用程序中有以下JSNI代码,它发出HTTP请求来检测URL重定向 -
private native void checkSession(String url)
/*-{
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(e) {
if (xhr.readyState == 4) {
if (url != xhr.responseURL) {
$wnd.alert("Your session has timed out.");
$wnd.location.assign(url);
}
}
}
xhr.open("GET", url, true);
xhr.send();
}-*/;
如果请求的URL与响应URL不同,则会话被视为超时;我想在其上显示一个警告框,让用户知道会话已经超时,并在他们点击确定时启动重定向。
我有一个实现AsyncCallback
的自定义类。使用this technique,我可以全局强制onFailure()
在checkSession()
发生时致电StatusCodeException
。
问题是警告框会在$wnd.location.assign(url)
启动重定向之前弹出几次。我意识到这里正在执行几个onFailure()
方法导致警报多次弹出,但我的问题是,为什么$wnd.location.assign(url)
在执行最后一个onFailure()
方法之前没有被执行,而$wnd.alert()
正好在它之上,每次都被执行?
如何在这种情况下强制重定向?理想情况下,我希望警报弹出一次,并在点击OK后立即重定向。
答案 0 :(得分:1)
根据this answer,浏览器将尝试执行剩余的JavaScript代码,直到重定向页面为止;这解释了在页面重定向之前发生多个警报。
为了解决这个问题,我宣布private static boolean redirect = false;
。
在JSNI代码中检测到网址重定向时,我会检查redirect
是否为false
,如果是,我会显示提醒并设置redirect = true
-
if (@fully.qualified.name::redirect == false) {
@fully.qualified.name::redirect = true;
$wnd.alert("Your session has timed out.");
}
$wnd.location.assign(url);
这样,我就可以在启动重定向之前只显示一次警报。