Wicket では、RedirectToUrlException
、ResponsePage
で指定した 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 の最新ソースを確認しています。
参考
-
wicket/RedirectToUrlException.java at master · apache/wicket
-
Inabaメモ: WicketのRedirectPage と jsessionid と IE の相性について・・・(汗)
RedirectToUrlException
一言でいうと、HTTP の Response Headerに Location を設定して、
リダイレクトさせています。
- クラス図
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"...
が効いて遷移してくれました。
その他ブラウザだとどうかまでは、見ておりません。。
以上です。
コメント