読者です 読者をやめる 読者になる 読者になる

いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

Tapestry奮闘記-0022 (Friendly URLsの設定)

java tapestry

Friendly URLsとは、TapestryのURL表記をフレンドリーなものにする設定のことです。
Tapestryのデフォルトでは、

http://xxxx/xxx/app?page=Home&service=page

という風になります。これでは、簡単に推測してアタックできます。
これを

http://xxxx/xxx/Home.html

という風にするのが、Friendly URLsです。

なお、今回はpageサービスとdirectサービスにFriendlyURLs設定を施します。
他にもassetエンコーダーや独自のサービスエンコーダー設定などもありますが、
そちらは、この記事の一番下のドキュメントを参照してください。

設定するには、以下のファイルに設定項目を記述します。

  1. web.xml
  2. HiveMind設定ファイル(WEB-INF/hivemodule.xml)

まずは、HiveMind設定ファイル(WEB-INF/hivemodule.xml)から。
こちらに使用するサービスエンコーダー設定を行います。
以下のように設定します。

<?xml version="1.0" encoding="Windows-31J"?>
<module id="my" version="1.0.0">

    <!--
        ServiceEncoderの設定
    -->
    <contribution configuration-id="tapestry.url.ServiceEncoders">

        <!--
            ページサービスエンコーダーを設定

            このエンコーダーはpageサービスに対して機能する。
        -->
        <page-service-encoder   id="page"   extension="html"             service="page"/>

        <!--
            ダイレクトサービスエンコーダーを設定

            このエンコーダーはdirectサービスに対して機能する。
        -->
        <direct-service-encoder id="direct" stateless-extension="direct" stateful-extension="sdirect"/>

    </contribution>

</module>

上記の設定では、pageサービスにHTML、ステートレスdirectにdirect、ステートフルdirectにsdirectという
拡張子を指定しています。このように設定することで、Tapestryは該当する拡張子から該当するサービスを
決定して実行するようになります。

あとは、上記で設定した拡張子に対してマッピングを行えば終わりです。
なお、もう必要ないので/appのマッピングは削除しています。

    <servlet-mapping>
        <servlet-name>MyTapestrySampleNoSpindle</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>MyTapestrySampleNoSpindle</servlet-name>
        <url-pattern>*.direct</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>MyTapestrySampleNoSpindle</servlet-name>
        <url-pattern>*.sdirect</url-pattern>
    </servlet-mapping>

これで、設定は終わりなのですが、/appのマッピングを削除したので、
前回設定したリダイレクトフィルターの設定がおかしくなっています。
実は、リダイレクトフィルターには、パラメータが渡せるようになっており、
リダイレクト先が指定できるようになっています。
前回設定したフィルター設定の部分を以下のように変更します。

    <!--
        Tapestryのリダイレクトフィルターを設定

        これを設定することにより、ブラウザからhttp//xxxx/xxx/という
        パスを設定された際に、http://xxxx/xxx/appにリダイレクトするようになる。

        このフィルターには、パラメータを渡すことができ、
        パラメータ名redirect-pathにルートパスが指定された際の
        リダイレクト先を設定できる。
    -->
    <filter>
        <filter-name>redirect</filter-name>
        <filter-class>org.apache.tapestry.RedirectFilter</filter-class>
        <init-param>
            <param-name>redirect-path</param-name>
            <param-value>/Home.html</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>redirect</filter-name>
        <url-pattern>/</url-pattern>
    </filter-mapping>

これで、ルートパスを指定された場合に、Home.htmlにリダイレクトするようになりました。
これで設定完了です。
ブラウザから画面を表示してみると、

http://xxxx/xxx/Home.html

となっているはずです。また、ページリンクの場合、今までは

http://xxxx/xxx/app?page=ThirdSample&service=page

となっていたのが、

http://xxxx/xxx/ThirdSample.html

となっていると思います。


Friendly URLsについては、以下のドキュメントが参考になります。
http://tapestry.apache.org/tapestry4.1/UsersGuide/friendly-urls.html


追記:それでも、directサービスの場合は、

http://xxxx/xxx/Home,myForm001.direct

のように、カンマ付きのURLになってしまうんですねぇ・・。
なんか嫌やな。w