我有所有逻辑来检查用户是否已登录,因此可以执行RPC调用。如果用户没有登录,我可以在所有RPC方法中放置此检查并抛出throw new MyLoginException()
。在客户端,我只检查此异常并相应地处理它。
现在的问题是:我不想把它放在每个RPC方法中。我想要一个通用的解决方案。
我试图覆盖在每次RPC调用之前调用的com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall()
之类的方法。问题在于:我只能抛出未经检查的异常,因为方法签名不允许我抛出自己的异常。未经检查的异常导致客户端代码中的一般异常,我无法正确处理它们,因为我不知道抛出了哪个异常。
我可以在哪里进行登录检查?这个问题有没有干净的解决方案?
答案 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);
}
}