Wicket 外部サイトへのリダイレクト方法について調べてみました。


Wicket では、RedirectToUrlExceptionResponsePage で指定した URL に、
リダイレクトが可能です。1 [1] 同じ WAR 内ならば、setResponsePage で飛んでいけばいいです。

この2クラスの違いがよくわからなかったので、調べてみました。

前提. 使用している Wicket Version

  • Wicket 7.5
    <dependency>
        <groupId>org.apache.wicket</groupId>
        <artifactId>wicket-core</artifactId>
        <version>7.5.0</version>
    </dependency>

そんなに変わっていないだろと思い、
ソースは、Github の最新ソースを確認しています。


参考


RedirectToUrlException

一言でいうと、HTTP の Response Headerに Location を設定して、
リダイレクトさせています。

  • クラス図

RedirectToUrlException

Response Header を設定する実処理は、WebResponse が行っており、
HTTP レスポンスコードによって、 HttpServletResponse#sendredirect() を呼び出す。 or
HTTP エラーコードを設定、Location を設定しています。

  • RedirectRequestHandler#respond(final IRequestCycle requestCycle)
        public void respond(final IRequestCycle requestCycle)
        {
            final String location;
    
            final String url = getRedirectUrl();
    
            if (url.charAt(0) == '/')
            {
                // context-absolute url
                location = requestCycle.getUrlRenderer().renderContextRelativeUrl(url);
            }
            else
            {
                // if relative url, servlet container will translate to absolute as
                // per the servlet spec
                // if absolute url still do the same
                location = url;
            }
    
            WebResponse response = (WebResponse)requestCycle.getResponse();
    
            if (status == HttpServletResponse.SC_MOVED_TEMPORARILY)
            {
                response.sendRedirect(location);
            }
            else
            {
                response.setStatus(status);
                response.setHeader("Location", location);
            }
        }
    

ResponsePage

一言で言うと、<META http-equiv="refresh" content="0;URL=http://www.monotalk.xyz/"> のように、META REFRESH を用いた遷移方法になります。
WebPage を継承したClassで、HTML側に、<META http-equiv="refresh"... の記載があり、
秒数と、URLをコンストラクタで指定できます。


使い分け

基本的に、RedirectToUrlException での遷移で問題ないと思います。
何らかの理由2 により、RedirectToUrlException を使用することができない場合、
ResponsePage を使えばよいように思いました。
[2] 例えば、HTTPヘッダインジェクション の対策などで、WAFの設定により、locationの設定がフィルタリングされる等


何らかの理由で、ResponsePage を使う場合の注意点

METAタグのREFRESHだと、ブラウザの履歴に、残ってしまい、
ブラウザの戻るで戻るが、またリダイレクトされて、戻れないという事象が発生します。3

使用する状況によっては、RedirectToUrlException でも、ResponsePage もユースケースに合わず、
詰む可能性がありそうです。

[3] 上手く戻れるブラウザもあるし、上手く戻れないブラウザもあると考えられます。


Javascript の location.replace を実行する ResponsePage を作る

javascriptのlocation.replaceを実行するResponsePageの拡張を作ってみました。
ソースはGistに置いておきます。

location.replace だけだと、javascript off だと、遷移しないので、
<META http-equiv="refresh"... の出力もします。
私の実行環境 (Mac OS, Chrome) だと、一応 javascript 優先、 javascriptがOffの時は、
<META http-equiv="refresh"... が効いて遷移してくれました。
その他ブラウザだとどうかまでは、見ておりません。。

以上です。

コメント

カテゴリー