繁体   English   中英

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

[英]Before every GWT RPC method call -> execute some check and throw a checked exception

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

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

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

我在哪里可以进行登录检查? 这个问题有什么清洁的解决方案吗?

我在Baz发布的链接中找到了解决方案: https ://groups.google.com/forum/#! topic / google-web-totokit / 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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM