当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");将它们重定向到登录页面。
发布于 2018-01-11 05:29:33
onFailure(Throwable caught) { logger.error(caught); }
您的AsyncCallback.onFailure正在做您要求它做的事情--它正在记录错误,而不是抛出错误。因为它没有被抛出,所以未被抛出的异常处理程序不能处理它(如果没有抛出它就不能不被捕获.如果这有意义的话)。
一个选项可能是您可以使用throw caught填充该方法,但是java不会喜欢这样的。相反,对特定on的最简单的回答是将其传递给处理程序:
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
});https://stackoverflow.com/questions/48190989
复制相似问题