う〜ん。jsessionidの表示なんて当たり前の感覚だったけど、素人さんは気になるみたい。
そもそも、jsessionidがURLに付く場合とは、クッキーがサポートされてない場合か、初回のレスポンス時だけ発生するもんだと解釈している。
なぜ初回だけかというと、サーバーにてクライアントがクッキーをサポートしているかどうかが判定できないから。
二度目以降のアクセスで、クッキーが返ってきた場合は、クッキーを通じてセッション管理ができるので、jsessionidはURLに埋め込まない。
携帯端末のようにクッキーが帰ってこない場合、二度目以降もjsessionidをURLに埋め込むというものだ。
また、今回はStrutsを使用していて、StrutsはURLをencodeURLメソッドで処理している。
そして、上記の判定で必要に応じてjsessionidをURLに埋め込んでいて、それは期待通りの挙動で、設定とかはない。
コンテナ側でURLリライティングを行わないようにすれば抑止できるだろうが、
クライアントによってはセッショントラッキングが行えなくなってしまう可能性があるし、
今回は携帯端末もクライアントに含まれるので、jsessionidの埋め込みは必須だ。
要はjsessionidの埋め込みは有効にしつつ、初回アクセス時の表示のみどうにかしないといけないということか。。。
さて、どうするか。
今回のアプリでは、たまたま、Url Rewrite Filterを利用していたので、これで抑制してみる。
Url Rewrite Filterとは、JavaベースのApache mod_rewriteのようなものだ。
これを使うとoutbound、つまりWebサーバからブラウザへレスポンスとして返すhtmlの中のURLを逆方向に書き換えることもできる。
早速、実験。
<outbound-rule encodefirst="true">
<from>(.*);jsessionid=[0-9A-Fa-f]{32}(.*)</from>
<to>$1$2</to>
</outbound-rule>
う〜ん。何か微妙。他の絡みのせいかうまくいかない。
じゃあ、別の玄関ページにアクセスしてもらって、そこから本物のページにリダイレクトさせる。
効率悪いけど、リダイレクトさせることによって、クライアントとサーバ間を2往復(ラウンドトリップ)するので、サーバーはクライアントのクッキーサポート状態は判定できるはず。
<logic:redirect page='<%= "/AAA/BBB/Top.do" %>' name="params" />
あれ?だめだ。Strutsのタグライブラリーを利用すると結局同じことか。
ということで、
response.sendRedirect("/AAA/BBB/Top.do");
に、書き直し。お。うまく行った!!
でも、玄関ページを経由しなかった場合は結局表示されるのだろうか?
今のところは、"/AAA/BBB/Top.do"に直にアクセスしても問題ない。
大丈夫なのかな?今度、調査してみるか。