在我的GWT应用中。我重写了RemoteServiceServlet,以便在调用服务方法之前检查会话是否有效。我试图从服务器抛出一个RuntimeException(“过期的会话”),我希望客户端从asynccallback onFailure中捕获此异常......
在客户端我想: 的AsyncCallback:
@Override
public void onFailure(Throwable caught) {
final String message = caught.getMessage();
if (!isNullOrEmptyString(message) && message.contains("expired session")) {
com.google.gwt.user.client.Window.Location.reload();
}
}
但是,在客户端中,捕获的对象仍然是StatusCodeException,并且消息仍然是默认的“...服务器中的异常...”。如果它是我从服务器发送的会话过期消息,我如何覆盖至少要比较的默认消息?
感谢
嗨Gursel, 这是我的代码: - >自定义RemoteServiceServlet。我试图在调用之前“拦截”每个方法。我检查会话并抛出一个RuntimeException,如果它已经过期了。所以基本上,抛出异常的声明方法不是自定义RemoteServiceServlet。它仍然转到客户端异步中的“onFailure”,但Throwable对象仍然是“StatusCodeException”类型,没有EXPIRED_SESSION_MSG消息。不要知道如何做这项工作。谢谢!
public class XRemoteServiceServlet extends RemoteServiceServlet {
private final static String EXPIRED_SESSION_MSG = "ERROR: Application has expired session.";
@Override
protected void onAfterRequestDeserialized(RPCRequest rpcRequest) {
HttpServletRequest httpServletRequest = this.getThreadLocalRequest();
HttpSession session = httpServletRequest.getSession(false);
if (session != null) {
final String sessionIdFromRequestHeader = getSessionIdFromHeader();
if (!isNullOrEmptyString(sessionIdFromRequestHeader)) {
final String sessionId = session.getId();
if (!sessionId.equals(sessionIdFromRequestHeader)) {
throw new RuntimeException(EXPIRED_SESSION_MSG);
}
}
答案 0 :(得分:5)
如果您没有在远程方法声明中声明它们,那么gwt应用程序的服务器端抛出的所有RuntimeExceptions
都被包装为StatusCodeException
。
编辑:
之后,Thomas Broyer评论说,我了解到在远程方法声明中声明的所有异常(已检查或未检查)都会传播到gwt客户端。因此,您只需要声明远程方法,例如:
public void myRemoteMethod() throws RuntimeException;
答案 1 :(得分:0)
帖子看起来太旧了,这里仍然是我想出的解决方案。覆盖processCall(String payload)
的{{1}},如果会话无效,请执行打击代码,然后调用RemoveServiceServlet
。
super.processCall(payload)
所有GWT服务都是servlet,因此GWT序列化自定义异常并以字符串形式发送给客户端,我们遵循相同的原则:)