簡體   English   中英

Wicket:如何重定向到另一個頁面?

[英]Wicket: how to redirect to another page?

如何使用Wicket重定向到另一個頁面? IIRC,必須在構造函數中拋出一些異常,但我不記得是哪一個。 提前致謝。

拋出RestartResponseAtInterceptPageException將會這樣做,正如您在自己的答案中所指出的那樣,但這實際上是允許在當前頁面(通常是授權過程的一部分)進行重定向的系統的一部分。 如果那不是你的情況,但你仍然需要做一些中斷處理的事情,那么拋出一個RestartResponseException可能會更好。

我知道的RestartResponseAtInterceptPageException的主要用法是在“重定向到登錄頁面”過程中。 如果您正在使用基於角色的身份驗證, IAuthorizationStrategy在確定您未登錄時的實現將發出已配置的IUnauthorizedComponentInstantiationListener信號,通常是AuthenticatedWebApplication ,如果您未登錄則會拋出此異常,並重定向到已配置登錄頁面。 (如果您已登錄但未經授權,則會發生其他情況......)。

實際的重定向由PageMap完成,在這種情況下也會記住您嘗試訪問的頁面。 成功登錄后,登錄頁面可以通過調用continueToOriginalDestination()來請求發送到您最初嘗試的頁面,這是Component一個方法,並從PageMap檢索記住的頁面。

這個身份驗證過程有一些很好的示例代碼 ,但異常和攔截在某種程度上隱藏在幕后。

使用客戶端重定向(HTTP 302,瀏覽器的URL更改)重定向到wicket頁面:

import org.apache.wicket.RestartResponseException;
import org.apache.wicket.request.mapper.parameter.PageParameters;
...
throw new RestartResponseException(
    TargetWicketPage.class, 
    new PageParameters().set("param1", "value1")); 

使用服務器重定向/轉發重定向到wicket頁面(瀏覽器的URL保持不變):

自Wicket 1.5RC5.1:

import org.apache.wicket.RestartResponseException;
import org.apache.wicket.request.handler.PageProvider;
import org.apache.wicket.request.handler.RenderPageRequestHandler.RedirectPolicy;
import org.apache.wicket.request.mapper.parameter.PageParameters;
...
throw new RestartResponseException(
    new PageProvider(
        TargetWicketPage.class, 
        new PageParameters().set("param1", "value1")), 
    RedirectPolicy.NEVER_REDIRECT));

在Wicket 1.5RC5.1之前:

import org.apache.wicket.request.RequestHandlerStack.ReplaceHandlerException;
import org.apache.wicket.request.handler.PageProvider;
import org.apache.wicket.request.handler.RenderPageRequestHandler;
import org.apache.wicket.request.handler.RenderPageRequestHandler.RedirectPolicy;
import org.apache.wicket.request.mapper.parameter.PageParameters;
...
throw new ReplaceHandlerException(
    new RenderPageRequestHandler(
        new PageProvider(
            TargetWicketPage.class, 
            new PageParameters().set("param1", "value1")), 
        RedirectPolicy.NEVER_REDIRECT), 
    true);

使用HTTP 302(“暫時移動”)重定向到URL:

import org.apache.wicket.request.flow.RedirectToUrlException;
...
throw new RedirectToUrlException("http://targetURL");

使用HTTP 301重定向到URL(“永久移動”,SEO友好):

import org.apache.wicket.request.flow.RedirectToUrlException;
import javax.servlet.http.HttpServletResponse;
...
throw new RedirectToUrlException("http://targetURL", 
    HttpServletResponse.SC_MOVED_PERMANENTLY);

快速搜索wicket中的所有*Exception.java文件。 必須拋出RestartResponseAtInterceptPageException

public MyPage() {
   ...
   if (redirect) {
       throw new RestartResponseAtInterceptPageException(targetPage);
   }
   ...
}

我剛發現

getRequestCycle().setResponsePage(MyOtherPage.class);

它至少在wicket 6中工作。它在服務器端工作並重寫URL。 也許它比使用異常快一點。

您可以使用

setResponsePage(new RedirectPage(“/”));

要么

setResponsePage(HomePage.class);

要么

拋出新的RestartResponseException(HomePage.class);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM