2011-11-20 56 views
1

我正在嘗試登錄到我的應用程序。首先,我扔RestartResponseAtInterceptPageException(這是一個WicketPanel我BasePage的):continueToOriginalDestination不會將我帶回原始頁面

add(new Link<String>("signin") { 
    @Override 
    public void onClick() { 
     throw new RestartResponseAtInterceptPageException(SignIn.class); 
    } 
}); 

的登錄頁面類包含在符號的形式(內部私有類),用下面的提交按鈕:

add(new Button("signinButton") { 

    @Override 
    public void onSubmit() { 
     final User user = model.getObject(); 
     final boolean result = MySession.get().authenticate(user); 
     if (result) { 
      if (!continueToOriginalDestination()) { 
       setResponsePage(MySession.get().getApplication().getHomePage()); 
      } 
     } else { 
      error("Authentication failed"); 
     } 
    } 
}); 

單擊此按鈕併成功驗證用戶身份後,我沒有重定向到單擊SignIn鏈接的頁面,而是停留在SignIn頁面上?我試過調試過這個,但一直沒有找到出錯的地方。

我很高興任何提示,導致我發現我的方式錯誤。

順便提一下,這是wicket 1.5.1。

小更新因爲我從答案中得到了我需要的提示,所以仍然有一些解釋要做。該解決方案是這樣的:

add(new Link<String>("signin") { 
    @Override 
    public void onClick() { 
    setResponsePage(new SignIn(getPage())); 
} 

的簽到類獲取一個構造函數,顯然需要一個網頁,我只是設置頁與setResponsePage回到那裏,我開始沒有所有的continueToOriginalDestination和異常拋出。

}); 
+0

嘗試實施了'onSubmit'法的形式,而不是在按鈕內。 – rotsch

+0

好主意,從來沒有想過它。儘管如此,它並沒有解決問題。但有了bernies提示,我找到了一個解決方案。謝謝。 – Yashima

回答

6

RestartResponseAtInterceptPageException意在用於在呈現頁面時重定向到攔截頁面。例如,在頁面類ProtectedPage的構造函數中,如果沒有用戶登錄,那麼您的throw new RestartResponseAtInterceptPageException(SignIn.class)。當SignIn頁面調用continueToOriginalDestination()時,用戶將被帶回原來的ProtectedPage目的地。

由於您將它放入鏈接處理程序中,因此您的使用不是RestartResponseAtInterceptPageException的典型用法。你爲什麼不直接做setResponsePage(SignIn.class)?如果你真的想回到你在點擊「登入」鏈接時,確切的頁面,你也可以嘗試將其更改爲:

add(new Link<String>("signin") { 
    @Override 
    public void onClick() { 
     setResponsePage(getPage()); 
     throw new RestartResponseAtInterceptPageException(SignIn.class); 
    } 
}); 
+0

感謝您解釋異常的實際使用。我曾看到它在這種情況下使用,並認爲使用範圍更廣。但我所做的就是虐待。所以我就停止使用這個異常,並簡單地將當前頁面作爲參數傳遞給SignUp頁面,然後我可以按照建議使用它來設置響應頁面。謝謝! – Yashima

相關問題