Wicket で
Wicket の
外す
結果は
canonical タグ を
使用している Wicket Version
- Wicket 7.5
<dependency> <groupId>org.apache.wicket</groupId> <artifactId>wicket-core</artifactId> <version>7.5.0</version> </dependency>
同じような 内容で 困った 人が いないのか
StackOverFlowで
How to delete version number in url for Wicket version 6.13.0 and newer ones? - Stack Overflow
[Apache Wicket bookmarkable url added one additional parameter to the link, why?
内容の
Wicket 1.5 であれば、
MountedMapper を継承した MountedMapperWithoutPageComponentInfo を 作ると
Version Numberは消える。 Wicket 6.13以上だと、
MountedMapperWithoutPageComponentInfo を作って 動かすだけだと、
ページのリロードが 走り続けるので、 RenderStrategy を ONE_PASS_RENDER に 変更する。
というような
RenderStrategyを 変えてみる
何が変わる ものなのか
Wicketで
あの
RenderStrategy に、
正直どう
日本語で
以下PPT資料を
内容と
ONE_PASS_RENDER
いわゆるforward REDIRECT_TO_BUFFER
PRG (バッファに 描画し リダ イレクト時に 返す )
sessionId + queryStringでbuffering
default動作REDIRECT_TO_RENDER
PRG (リダイレクト時に 描画する )
refreshしても大丈夫
ONE_PASS_RENDER を 設定してみる
Applicationクラスに
getRequestCycleSettings(). setRenderStrategy(RequestCycleSettings.RenderStrategy.ONE_PASS_RENDER);
この設定で
version number は
302リダイレクトされなくなり、
REDIRECT_TO_BUFFER を 設定してみる
Applicationクラスに
getRequestCycleSettings(). setRenderStrategy(RequestCycleSettings.RenderStrategy.REDIRECT_TO_BUFFER);
302リダイレクトされるようになります。
REDIRECT_TO_RENDER を 設定してみる
getRequestCycleSettings(). setRenderStrategy(RequestCycleSettings.RenderStrategy.REDIRECT_TO_RENDER);
Document読んだ
Pageを
version number は
Pageを
POST送信後の
そちらの
ONE_PASS_RENDER、 REDIRECT_TO_RENDER の POST時の 動作の 違い
POSTで
動作確認には、
に
Form から
ONE_PASS_RENDER
http://127.0.0.1:18080/festivals?25-1.IFormSubmitListener-f
REDIRECT_TO_RENDER
http://127.0.0.1:18080/festivals/2?10
3
ONE_PASS_RENDER は、
Render strategies に
REDIRECT_TO_RENDER は、
Wicket の document の 付録 に ある クラスタリング環境下での、 RenderStrategyの 動作から
Wicket の
28 Lost In Redirection With Apache Wicket (Appendix) 6.x
ざっくり
クラスリング環境下での、
REDIRECT_TO_BUFFERの 動作の 留意点
Application サーバーが複数台ある 場合、 ラウンドロビンで リクエストを 割り当てていると、
REDIRECT_TO_BUFFER で処理を していると、
BufferしているAPサーバーに 処理が 割り当てられず、
Buffer後のResponseが 取得できない 場合が ある。 留意点の
解決策
ラウンドロビンで処理を 振り分けたい 場合は、 ONE_PASS_RENDER を 使う 必要が あるが、
Formの2重送信問題等、 別の 問題が 発生する。
REDIRECT_TO_BUFFER でも
できるようになる。
どれを 使うかの 個人的な 見解
以下の
REDIRECT_TO_BUFFER に
する。
Page Version管理ができなくなるのを 許容して、
MountedMapperWithoutPageComponentInfo を使い、
且つ、
クラスタリング環境下では、スティッキーセッションを 使う。 REDIRECT_TO_RENDER に
する。
Form のPost後の リダイレクトの バージョン番号を 消すため、
MountedMapperWithoutPageComponentInfoも使う。
且つ、
クラスタリング環境下では、スティッキーセッションを 使う。 ONE_PASS_RENDER に
する。
Form の二重送信問題は、 明示的に リダイレクトさせる ことで 回避する。
クラスタリング設定は、
スティッキーセッションを使うでも ラウンドロビンでもどちらでも OK。 Version番号を
消すことは、 諦める。
canonical タグ を使って、 URLは 正規化する。
且つ、
クラスタリング環境下では、スティッキーセッションを 使う。
個人的には、
3で、
実装する 場合も、 jsessionId は 別途対策しないと いけない。 クラスタリング設定に
ついては、 スティッキーセッションで 良いと 思っている。 ONE_PASS_RENDER で、
Form以外にも、 対応しないと いけない パターンが どれくらいあるのかで 読めない。
ところから、
追記
基本的に、
ONE_PASS_RENDER したいと
全体が
Wicket 6.13以上だと、NoVersionMapper
と
試しに
Classを
getRootRequestMapperAsCompound().add(new NoVersionMapper("/festivals/${id}", FestivalDetailPage.class));
REDIRECT_TO_BUFFER の
canonical タグの 設定方法に ついて
Url (Wicket Parent 6.26.0-SNAPSHOT API) に、
org.apache.wicket.request.Url#canonical() を
こちらを
アプリケーションの
- Page基底クラスの
追加記述 @Override public void renderHead(IHeaderResponse response) { // Meta canonical response.render(MetaDataHeaderItem.forLinkTag("canonical", getCanonicalUrl())); } /** * getCanonicalUrl * * @return */ protected String getCanonicalUrl() { Url url = getRequestCycle().getRequest().getUrl(); System.out.println("url.toString()=" + url.toString()); System.out.println("url.getPath() =" + url.getPath()); System.out.println("url.toString(Url.StringMode.FULL) =" + url.toString(Url.StringMode.FULL)); System.out.println("url.canonical().getPath() =" + url.getPath()); return url.canonical().getPath(); }
URL `http://127.0.0.1:18080/festivals;jsessionid=1d1cz1rff0kc917o6sna0tv22x?0
が、
画面上表示されている
HTMLの
HTML
<link rel="canonical" href="festivals" />
OUTPUT
url.toString()=festivals url.getPath() =festivals url.toString(Url.StringMode.FULL) =http://127.0.0.1:18080/festivals url.canonical().getPath() =festivals
HTMLは
org.apache.wicket.request.Urlの
jsessionid
は
URLの
HTTPサーバーから、
domain名は
Urlも、
- getCanonicalUrl
/** * getCanonicalUrl * * @return */ protected String getCanonicalUrl() { return ResourceBundle.getBundle("xyz.monotalk.festivals4partypeople.web.WicketApplication").getString("domainName") + "/" + RequestCycle.get() .mapUrlFor(getClass(), null) .toString(); }
Behaviorクラスを 作って、 Pageに ADDする
Behaviorクラスの
リンクを
補足. ONE_PASS_RENDER で、 Form Submit時に 別ページへ リダイレクトさせる
ONE_PASS_RENDER で
Form を
http://127.0.0.1:18080/festivals?25-1.IFormSubmitListener-f
とhttp://127.0.0.1:18080/festivals/2
の
遷移させる
- RequestCycle#setResponsePage(Class pageClass, PageParameters parameters) を
使って 遷移させる。
以下の
ブラウザにhttp://127.0.0.1:18080/festivals?25-1.IFormSubmitListener-f
で
http://127.0.0.1:18080/festivals/2
で
修正前
@Override protected void onSubmit() { PageParameters param = new PageParameters(); param.add("id", 2); setResponsePage(new FestivalDetailPage(param)); }
修正後
@Override protected void onSubmit() { PageParameters param = new PageParameters(); param.add("id", 2); setResponsePage(FestivalDetailPage.class, param); }
何故URLの
RedirectPolicy が
RequestCycle#setResponsePage(IRequestablePage page)
/** * Convenience method for setting next page to be rendered. * * @param page */ public void setResponsePage(IRequestablePage page) { if (page instanceof Page) { ((Page) page).setStatelessHint(false); } // RenderPageRequestHandler.RedirectPolicy.AUTO_REDIRECT を指定 scheduleRequestHandlerAfterCurrent(new RenderPageRequestHandler(new PageProvider(page), RenderPageRequestHandler.RedirectPolicy.AUTO_REDIRECT)); }
RequestCycle#setResponsePagesetResponsePage(Class pageClass, PageParameters parameters)
/** * Convenience method for setting next page to be rendered. * * @param pageClass * The class of the page to render * @param parameters * The query parameters for the page to be rendered */ public void setResponsePage(Class<? extends IRequestablePage> pageClass, PageParameters parameters) { //RenderPageRequestHandler.RedirectPolicy.ALWAYS_REDIRECT を指定 setResponsePage(pageClass, parameters, RenderPageRequestHandler.RedirectPolicy.ALWAYS_REDIRECT); }
AUTO_REDIRECT だと、
ALWAYS_REDIRECT だと
長くなりましたが、
[1] URLの?0
、?23
の
[2] MountedMapperWithoutPageComponentInfo
[3] http://127.0.0.1:18080/festivals?25-1.IFormSubmitListener-f
から
[4] 個人の。。<wbr>
[5] アプリケーションデプロイ時の
[6] ONE_PASS_RENDER の
[7] 似たような
コメント