2013-11-20 46 views
0

我有一個受保護的頁面檢票口安裝了一個路徑參數,比如這個:如何在檢票口登錄頁面使用路徑參數

class MyApp extends AuthenticatedWebApplication { 
    @Override protected void init() { 
    mountPage("/login/${site}", MyLoginPage.class); 
    mountPage("/admin/${site}", MyAdminPage.class); 
    } 
    @Override protected Class<? extends WebPage> getSignInPageClass() { 
    return MyLoginPage.class; 
} } 

@AuthorizeInstantiation("ADMIN") 
class MyAdminPage extends WebPage { ... } 

我想保持這個「點」參數在登錄頁面(我需要登錄過程中的這個參數)。但顯然默認AuthenticatedWebApplication::onUnauthorizedInstantiation攔截器重定向到沒有任何參數的登錄頁面,所以當訪問管理頁面時,我被重定向到一個NULL站點的登錄頁面...

我該如何重新使用「站點」參數在登錄頁面?我最終可以重寫我自己的AuthenticatedWebApplication來編寫一個特定的onUnauthorizedInstantiation攔截器,但是可能有一種更簡單的方法來實現。

一個要求是保持登錄頁面可收藏,所以「site」參數應該是URL的一部分(作爲路徑參數)。

+0

你吃過看看continueToOriginalDestination法已經(http://ci.apache.org/projects/wicket/apidocs/6.0.x/org/apache/wicket/Component.html#continueToOriginalDestination% 28%29)?我只需安裝我的(安全)頁面,如果您在打電話時未登錄,則會重定向到登錄頁面,然後從那裏進入原始網站。沒有將URL作爲參數傳遞的麻煩。 –

+0

問題是將原始頁面的「站點」頁面參數傳遞給登錄頁面本身,而不是原來的頁面參數。重定向到原始頁面不是問題。 –

+0

但爲什麼你需要在你的登錄頁面中的「站點」參數? –

回答

1

重寫方法restartResponseAtSignInPage來調用您的登錄頁面併爲您的站點創建一個特定的參數。我以整體上下文路徑給你一個例子,因爲我不完全知道你用什麼來識別網站。

class MyApp extends AuthenticatedWebApplication { 

    @Override protected void init() { 
     super.init(); 
     mountPage("/login/${site}", MyLoginPage.class); 
     mountPage("/admin/${site}", MyAdminPage.class); 
    } 

    @Override 
    public void restartResponseAtSignInPage() { 
     // contextPath is just an example, implement here anything 
     // you use to identify the page or site 
     String contextPath = RequestCycle.get().getRequest().getContextPath(); 
     throw new RestartResponseAtInterceptPageException(new MyLoginPage(new PageParameters().add("site", contextPath))); 
    } 
} 

編輯

注1:如果要繼續與任何從原來的請求參數,請參閱如何從請求週期中提取參數

IRequestParameters requestParameters = RequestCycle.get().getRequestParameters(); 

NOTE2 :您可以真正覆蓋原始AuthenticatedWebApplication的完整功能,這有點複雜,因爲o f最終方法。可能您必須修改以下代碼才能準確提取您的站點參數,但我並不完全清楚。

class MyApp extends AuthenticatedWebApplication { 

@Override 
protected void init() { 
    super.init(); 
    mount("/login/${site}", MyLoginPage.class); 
    mountPage("/admin/${site}", MyAdminPage.class); 
    getSecuritySettings().setUnauthorizedComponentInstantiationListener(new IUnauthorizedComponentInstantiationListener() { 

     @Override 
     public void onUnauthorizedInstantiation(Component component) { 
      MyApp.this.onMyUnauthorizedInstantiation(Component component); 

     } 
    }); 
} 

public void onMyUnauthorizedInstantiation(final Component component) { 
    if (component instanceof Page) 
    { 
     if (!AbstractAuthenticatedWebSession.get().isSignedIn()) 
     { 
      // Redirect to intercept page to let the user sign in 
      restartResponseAtSignInPage((Page)component); 
     } 
     else 
     { 
      onUnauthorizedPage((Page)component); 
     } 
    } 
    else 
    { 
     // The component was not a page, so throw an exception 
     throw new UnauthorizedInstantiationException(component.getClass()); 
    } 
} 


@Override 
public void restartResponseAtSignInPage(Page page) { 
    // contextPath is just an example, implement here anything 
    // you use to identify the page or site 
    throw new RestartResponseAtInterceptPageException(new MyLoginPage(new PageParameters().add("site", page.getPageParameters().get("site").toString("defaultValue")))); 
} 

} 
+0

我以前已經試過,但我想從請求中獲取原始頁面參數以獲取正確的網站。我可以通過手動解析請求的客戶端URL來使用解決方法,但這很容易出錯,因爲它依賴於頁面裝入方式的假設。我想我理論上可以訪問頁面參數,因爲在這種方法中設置斷點時,我可以在堆棧跟蹤中的某處向上看到它們。 –

相關問題