当Tomcat会话超时时,我想将我的用户重定向到我的GWT应用程序的主页,以便他们可以再次登录。为了强制执行此操作,我试图在用户尝试在会话超时后执行任何操作时使用GWT抛出的StatusCodeException
-
SEVERE: com.google.gwt.user.client.rpc.StatusCodeException: 0
为实现这一目标,我使用以下代码 -
public void onModuleLoad() {
GWT.UncaughtExceptionHandler uncaughtExceptionHandler = new GWT.UncaughtExceptionHandler() {
public void onUncaughtException(Throwable e) {
if (e instanceof StatusCodeException) {
logger.log(Level.ERROR, "Exception caught!");
logger.log(Level.ERROR, ((StatusCodeException) e).getStatusCode());
}
}
};
GWT.setUncaughtExceptionHandler(uncaughtExceptionHandler);
try {
// rest of the code in onModule() - I'm expecting any operation to throw StatusCodeException when session times out.
} catch (RuntimeException ex) {
uncaughtExceptionHandler.onUncaughtException(ex);
}
}
这不起作用。而不是被代码捕获,StatusCodeException
正在控制台上显示。我在这里做错了什么?
我们的想法是捕获StatusCodeException
并使用其getStatusCode()
方法来确定HTTP错误代码是否为403
。如果是,我想使用Window.Location.assign("https://example.com/redirect");
将它们重定向到登录页面。
答案 0 :(得分:1)
onFailure(Throwable caught) { logger.error(caught); }
您的AsyncCallback.onFailure正在执行您要求它执行的操作 - 它正在记录错误,但不会抛出错误。因为它没有被抛出,所以未被捕获的异常处理程序不处理它(它不能被捕获,如果它没有被抛出......如果这是有道理的。)
一个选项可能是您可以使用throw caught
填充方法,但java不会喜欢这个。相反,对您的具体内容的最简单答案就是将其传递给处理程序:
onFailure(Throwable caught) { GWT.getUncaughtExceptionHandler().onUncaughtException(ex); }
你有另一个选择:因为没有AsyncCallback会抛出这个,所以将StatusCodeException放在UncaughtExceptionHandler中似乎有点奇怪。相反,请考虑制作自己的AsyncCallback基类,如下所示:
public abstract class NetworkAsyncCallback<T> implements AsyncCallback<T> {
@Override
public void onFailure(Throwable t) {
if (e instanceof StatusCodeException) {
logger.log(Level.ERROR, "Exception caught!");
logger.log(Level.ERROR, ((StatusCodeException) e).getStatusCode());
}
}
}
现在,当您拨打电话时,您只需传入新的NetworkAsyncCallback<T>
并仅实施onSuccess
。如果要做的就是将异常传递给未捕获的处理程序,则可以跳过onFailure
。或者,如果您有其他逻辑,则可以覆盖onFailure
,处理相应的异常,并使用任何其他错误调用super.onFailure(caught)
,以便超类处理它。
myServer.getSomeData(param, new NetworkAsyncCallback<Result>() {
@Override
public void onSuccess(Result result) {
//...
}
// Skip onFailure, or if you need custom logic, implement it,
// and call super only if the exception isn't part of that logic
});