2014-10-01 71 views
1

我有检查用户是否已登录并因此被允许执行RPC调用的所有逻辑。如果用户没有登录,我可以在所有的RPC方法中放置这个检查,并抛出一个throw new MyLoginException()。在客户端,我只是检查这个异常并相应地处理它。在每个GWT RPC方法调用之前 - >执行一些检查并抛出一个检查的异常

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

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

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

+0

你可以做一些像[this](http://www.objectpartners.com/2013/04/04/improving-the-gwt-async-callback/)。 – Baz 2014-10-01 09:23:09

+0

@巴兹我有这样的事情。但这并不能帮助我,因为这只是在客户端。如果我在后端抛出未经检查的异常,我只是在客户端收到一个通用错误,无法确定哪里出错。 – jan 2014-10-01 09:33:10

+0

我似乎不明白。为什么只能从服务器中引发一个未经检查的异常? – Baz 2014-10-01 10:07:44

回答

3

我发现张贴巴兹链路解决方案: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); 
    } 
} 
+0

非常好,很高兴知道它解决了。 – Baz 2014-10-02 08:41:11

+0

你如何处理/捕捉客户端上的异常?我好像收到了一个'IncompatibleRemoteServiceException',它以某种方式包含我的实际异常。 – Baz 2014-10-30 13:37:29

+0

@巴兹我更新了我的回答 – jan 2014-10-30 13:47:49

相关问题