在每个GWT RPC方法调用之前 - >执行一些检查并抛出一个检查过的异常

时间:2014-10-01 09:17:54

标签: java exception servlets gwt signature

我有所有逻辑来检查用户是否已登录,因此可以执行RPC调用。如果用户没有登录,我可以在所有RPC方法中放置此检查并抛出throw new MyLoginException()。在客户端,我只检查此异常并相应地处理它。

现在的问题是:我不想把它放在每个RPC方法中。我想要一个通用的解决方案。

我试图覆盖在每次RPC调用之前调用的com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall()之类的方法。问题在于:我只能抛出未经检查的异常,因为方法签名不允许我抛出自己的异常。未经检查的异常导致客户端代码中的一般异常,我无法正确处理它们,因为我不知道抛出了哪个异常。

我可以在哪里进行登录检查?这个问题有没有干净的解决方案?

1 个答案:

答案 0 :(得分:3)

我在Baz发布的链接中找到了解决方案:https://groups.google.com/forum/#!topic/google-web-toolkit/D2MPaD2EpOQ

而不是像这样抛出异常(这是不可能的,因为签名只允许SerializationException

@Override
public String processCall(String payload) throws SerializationException {

    if(!userIsAuthorized()){
        throw new MyAuthorizationException();
    }

    return super.processCall(payload);
}

必须在响应中返回异常,如下所示:

@Override
public String processCall(String payload) throws SerializationException {

    if(!userIsAuthorized()){
        return RPC.encodeResponseForFailure(null, new MyAuthorizationException());
    }

    return super.processCall(payload);
}

每次调用RPC调用时都会调用此方法,如果用户未获得授权,则不会执行该方法,并且将检查的异常传输到可以相应处理的前端。

编辑 @Baz:这就是客户端处理对我来说的样子。但我认为如果你得到一个IncompatibleRemoteServiceException,你就会遇到一个问题,即你的浏览器会缓存一些旧东西,你需要清理你的缓存。

@Override
public void onFailure(Throwable caught) {
    try {
        throw caught;
    }
        catch (SessionExpiredException ex){
            onSessionExpired();
    }catch(Throwable e){
        MyCallback.this.onFailure(e);
    }
}