- - PR -
Tomcat:mimeによるerror-pageの振り分けについて
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-07-03 15:53
いつもお世話になっております。
Tomcat web.xmlの<error-page>にはServlet/JSPも指定できますが、 このままだと画像ファイル等のテキストファイル以外が404エラーになった場合も、 該当のServlet/JSPにリダイレクトされてしまいます。 この回避策をご存知でしたら、ぜひご教示ください。 | ||||
|
投稿日時: 2006-07-04 10:16
わかりづらかったかもしれないので補足説明です。
リダイレクトされると困るのは、画像を直接URL指定した場合ではなく、 htmlファイル中に<img>タグがあり、その画像が存在しなかったときです。 現在の実装では404エラーの場合、トップページ用のJSPに リダイレクトする仕様なのですが、そのJSP上でアクセスカウントをしております。 トップページJSP内の<img>タグのリンクが切れていると ダブルカウントされてしまいます。 要は、このダブルカウントさえ回避できればよいので 何か名案がありましたら、ぜひご教示ください。 | ||||
|
投稿日時: 2006-07-04 10:39
厳密言うとmime-typeで判断しているわけではないですが、
JSPのスクリプトレットで request.getRequestURI()を取ってきて、 それが*.htmlか*.jspの場合だけトップページにフォワードするか アクセスカウントを増やすかするというのはどうでしょうか。 | ||||
|
投稿日時: 2006-07-04 11:56
返信ありがとうございます。 さっそく試してみたのですが、エラー遷移後にrequest.getRequestURI()で取得できるURIは <error-page>で指定したURIになってしまうようです。 元のリクエスト情報をどこかから取得できれば koeさんの方法で回避できると思うのですが。 (追記) Tomcatのバージョンは5.5.17です。 [ メッセージ編集済み 編集者: wantan 編集日時 2006-07-04 12:16 ] | ||||
|
投稿日時: 2006-07-04 18:11
結局下記のような対応で回避することにしました。
1. すべての画像リクエストをフックするサーブレットを作成 2. サーブレット内で context.getRealPath() で存在チェック 3. 画像ファイルが存在すればOutputStreamで出力 4. 画像ファイルが存在しない場合、そのままreturn web.xml------------------------------------------------- <servlet> <servlet-name>all_gif</servlet-name> <servlet-class>hoge.GifServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>all_gif</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> -------------------------------------------------------- GifServlet---------------------------------------------- doGet(HttpServletRequest req, HttpServletResponse res) { String name = req.getServletPath(); String realpath = this.getServletContext().getRealPath(name); File f = new File(realpath); if (f.isFile()) { FileInputStream fis = new FileInputStream(f); OutputStream os = res.getOutputStream(); int i = 0; while ((i = fis.read()) != -1 ) { os.write(i);} fis.close(); os.close(); } else { return; } } -------------------------------------------------------- もしこれよりよい方法をご存知でしたらお知らせください。 | ||||
|
投稿日時: 2006-07-04 20:25
お役に立てませんでしたが、とりあえず解決策が見つかって何よりです。
他の方法ですが、Webサーバの設定で解決するというのはどうでしょうか? 業務用途だと、画像などの静的コンテンツはWebサーバに処理させると 思いますが、Apacheと連携させるのであればいい方法がありそうです。 試していませんが、httpd.confに以下のような設定をすることで 可能ではないでしょうか?
※上の¥は、本来は半角です。なぜか半角で出ませんでした…。 こうしておくと、/hoge/以下のgifファイルへのリクエストに対して 404エラーを返すとき、/hoge/error404.htmlを返すようになる… と思います(;^ ^)。試してないので分かりませんが。 | ||||
|
投稿日時: 2006-07-04 21:31
どうせならdoFilter()するとか。 servlet->filterにするだけなので意味はないかもしれない。 | ||||
|
投稿日時: 2006-07-05 09:02
Tomcat 4.1を使っていますが、forward していなければ
request.getRequestURL()できちんとリクエストされたURLが取得できています。 |