[英]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.