Url Rewrite Filter

UrlRewriteFilter - Rewrite URL's in Java Web Application Servers

apachemod_rewriteみたいなことができるServletFilter。
ちょっと前にマイコミジャーナルで存在を知り、ちょうど新旧アプリの入れ替えというURLをちょこちょこ差し替えるような用事が出来たので、
仕事で使ってみようかと思い弄ってみました。
記事を読んだ限りではものすごく有用そうでしたが、実際に触った感じではちょっと物足りないかも。


いえ、記事では

http://www.example.com/diary/diary.cgi?year=2007&month=05&day=12

というURLよりも

http://www.example.com/diary/2007/05/12

というURLのほうがユーザにとってもわかりやすいし

このような/区切りのURLとクエリストリングのマッピングが簡単に出来るよ、
みたいな話で、そういうことをやる分にはかなり使いやすいと思います。
判断の条件としてServletRequestに入ってるものは大体使えるみたいですし、
Actionの差し替えあたりだと凄く簡単に出来ますし。


ただ結局、URLを構成するパーツをブロックみたいにホイホイ組み換えるのが限度なんです。
例えば特定条件の場合、URLエンコードされた全角文字列のパラメタを、
別のエンコーディングでURLエンコードしたものに差し替えたりしたいとかいう時、
run要素で外部のメソッドを呼べるんだから、デコード・再エンコードだけ外部メソッドに記述してやればすぐ出来そうです。
が、あくまで呼び出せるのはServletのdo何某メソッドと同じシグニチャのメソッドだけなので、
処理を挿入することは出来ても、直接的に何かの値をいれてとってくるということは出来ません。
なので、ServletRequestのattribute経由で渡してやればいいのかと思い、

<rule>
  <from>/hogehoge?(.*)$</from>
  <run class="Fugafuga" method="doSomeMethod" />
  <to type="redirect">/piyopiyo?%{SOME-ATTRIBUTE}</to>
</rule>

こんな感じで、やってみたものの、どうやらattributeが読まれてto要素のpathが組み立てられるのは、
run要素で指定したメソッドが実行されるより前のようであえなく失敗。
やるんなら、run要素でメソッドを実行してattributeを設定するruleの後に、
実際にredirectなりforwardなりするto要素を持ったruleを置いてやらないといけないみたいです。

<rule>
  <from>/hogehoge?(.*)$</from>
  <run class="Fugafuga" method="doSomeMethod" />
</rule>
<rule>
  <from>/hogehoge?(.*)$</from>
  <to type="redirect">/piyopiyo?%{SOME-ATTRIBUTE}</to>
</rule>

↑こんな感じで。


なんか上手く部品化できてる感じがしないし、キモイです。
あんまり多くの期待はしないで、run要素で実行するメソッドの中に、
redirectやforwardを直書きしちゃったほうが無難なんでしょうかね。
機能について誤解しているところもまだまだあるだろうし、もう少し弄ってみるとします。