- PR -

Tomcat:mimeによるerror-pageの振り分けについて

投稿者投稿内容
wantan
会議室デビュー日: 2006/07/03
投稿数: 7
投稿日時: 2006-07-03 15:53
いつもお世話になっております。

Tomcat web.xmlの<error-page>にはServlet/JSPも指定できますが、
このままだと画像ファイル等のテキストファイル以外が404エラーになった場合も、
該当のServlet/JSPにリダイレクトされてしまいます。

この回避策をご存知でしたら、ぜひご教示ください。
wantan
会議室デビュー日: 2006/07/03
投稿数: 7
投稿日時: 2006-07-04 10:16
わかりづらかったかもしれないので補足説明です。

リダイレクトされると困るのは、画像を直接URL指定した場合ではなく、
htmlファイル中に<img>タグがあり、その画像が存在しなかったときです。

現在の実装では404エラーの場合、トップページ用のJSPに
リダイレクトする仕様なのですが、そのJSP上でアクセスカウントをしております。
トップページJSP内の<img>タグのリンクが切れていると
ダブルカウントされてしまいます。

要は、このダブルカウントさえ回避できればよいので
何か名案がありましたら、ぜひご教示ください。
koe
大ベテラン
会議室デビュー日: 2003/07/13
投稿数: 198
投稿日時: 2006-07-04 10:39
厳密言うとmime-typeで判断しているわけではないですが、
JSPのスクリプトレットで
request.getRequestURI()を取ってきて、
それが*.htmlか*.jspの場合だけトップページにフォワードするか
アクセスカウントを増やすかするというのはどうでしょうか。
wantan
会議室デビュー日: 2006/07/03
投稿数: 7
投稿日時: 2006-07-04 11:56
引用:

JSPのスクリプトレットで
request.getRequestURI()を取ってきて、


返信ありがとうございます。

さっそく試してみたのですが、エラー遷移後にrequest.getRequestURI()で取得できるURIは
<error-page>で指定したURIになってしまうようです。

元のリクエスト情報をどこかから取得できれば
koeさんの方法で回避できると思うのですが。

(追記)
Tomcatのバージョンは5.5.17です。

[ メッセージ編集済み 編集者: wantan 編集日時 2006-07-04 12:16 ]
wantan
会議室デビュー日: 2006/07/03
投稿数: 7
投稿日時: 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;
}
}
--------------------------------------------------------

もしこれよりよい方法をご存知でしたらお知らせください。
koe
大ベテラン
会議室デビュー日: 2003/07/13
投稿数: 198
投稿日時: 2006-07-04 20:25
お役に立てませんでしたが、とりあえず解決策が見つかって何よりです。

他の方法ですが、Webサーバの設定で解決するというのはどうでしょうか?
業務用途だと、画像などの静的コンテンツはWebサーバに処理させると
思いますが、Apacheと連携させるのであればいい方法がありそうです。
試していませんが、httpd.confに以下のような設定をすることで
可能ではないでしょうか?
コード:
<DirectoryMatch "/hoge/(.*)¥.gif">
    ErrorDocument 404 /hoge/error404.html
</DirectoryMatch>


※上の¥は、本来は半角です。なぜか半角で出ませんでした…。
こうしておくと、/hoge/以下のgifファイルへのリクエストに対して
404エラーを返すとき、/hoge/error404.htmlを返すようになる…
と思います(;^ ^)。試してないので分かりませんが。
加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2006-07-04 21:31
引用:

wantanさんの書き込み (2006-07-04 18:11) より:

1. すべての画像リクエストをフックするサーブレットを作成

もしこれよりよい方法をご存知でしたらお知らせください。



どうせならdoFilter()するとか。
servlet->filterにするだけなので意味はないかもしれない。

ひろ@ya
大ベテラン
会議室デビュー日: 2006/02/23
投稿数: 168
投稿日時: 2006-07-05 09:02
Tomcat 4.1を使っていますが、forward していなければ
request.getRequestURL()できちんとリクエストされたURLが取得できています。

スキルアップ/キャリアアップ(JOB@IT)