簡體   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