web-dev-qa-db-ja.com

Wicket:別のページにリダイレクトする方法は?

Wicketを使用して別のページにリダイレクトするにはどうすればよいですか? IIRC、いくつかの例外をコンストラクターでスローする必要がありますが、どれを覚えているかは覚えていません。前もって感謝します。

20
Mot

あなた自身の答えで述べたように、RestartResponseAtInterceptPageExceptionをスローすることでそれを実行しますが、それは実際には現在のページでの継続的なリダイレクト(多くの場合、承認プロセスの一部)でリダイレクトを許可するシステムの一部です。それがあなたの状況ではないが、それでも処理を中断する何かをしなければならない場合は、RestartResponseExceptionをスローする方がよいでしょう。

RestartResponseAtInterceptPageExceptionについて私が知っている主要な使用法は、「ログインページへのリダイレクト」プロセスです。ロールベースの認証を使用している場合、ログインしていないと判断したIAuthorizationStrategyの実装は、構成済みのIUnauthorizedComponentInstantiationListener、通常はログインしていない場合にこの例外をスローするAuthenticatedWebApplicationに信号を送り、構成済みのログインページ。 (ログインしているのに権限がない場合は、何か他のことが起こります...)。

実際のリダイレクトはPageMapによって行われます。この場合も、移動しようとしたページが記憶されています。ログインが成功した後、ログインページは、ComponentのメソッドであるcontinueToOriginalDestination()を呼び出して、最初に試みていたページに移動するように要求し、PageMapから記憶されたページを取得します。

この認証プロセスにはいくつかの優れた サンプルコード がありますが、例外とインターセプトが裏で隠れています。

29
Don Roby

Client-redirect(HTTP 302、ブラウザーのURLの変更)を使用して、改ページにリダイレクトします。

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

サーバーのリダイレクト/フォワードを使用して、改ページにリダイレクトします(ブラウザーの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);
23
sother

すべてのクイック検索*Exception.Java改札内のファイルはそれを明らかにした。 RestartResponseAtInterceptPageExceptionをスローする必要があります:

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

見つけた

getRequestCycle().setResponsePage(MyOtherPage.class);

少なくとも改札6で機能しています。サーバー側で機能し、URLも書き換えます。多分それは例外を使用するよりも少し速いです。

1
user2081279

あなたは使うことができます

setResponsePage(new RedirectPage( "/"));

または

setResponsePage(HomePage.class);

または

新しいRestartResponseException(HomePage.class);をスローします。

1
Shubham Pandey