サーブレットでファイルダウンロード(サンプルコード)。

doPost()または、doGet()内で


res.setContentType("application/octet-stream");
res.setHeader("Content-Disposition", "attachment;filename=\"hoge.txt\"");
PrintWriter out = res.getWriter();
out.println("hoge");←改行コードが処理系(サーバ側)依存になるけど。
こんな感じ。(先日のIEでの問題を考慮すると、POSTがベター?

しかし、Tomcat3.2.4+mod_jk(バージョン不明)+Apache1.3.28(まだ1.3.29にしてなかったの? というツッコミは不可(笑))の組み合わせでPOST(GETなら問題無し)すると、ApacheInternal Server Errorが起きる...(Tomcatのポート直ならPOST/GET共に問題なし。


正確にはもう一つ

  • doPost()メソッド内で、引数にて渡されるHttpServletRequestオブジェクトの、getParameter()を一度も呼んでいない場合。

という条件があるようです。
つまり、


String strWord = req.getParameter("Hoge");
の1行をコメントアウトするだけで、Internal Server Errorが発生します(確認しました)。
ヘッダの指定は関係ないようで、

res.setHeader("Content-Disposition", "attachment;filename=\"hoge.txt\"");
以外にも例えば、

res.setContentType("text/html; charset=Shift_JIS");
でも起きますし、無指定でも発生するようです。
これがmod_jkに起因する問題かどうかは分かりませんが。
(まあ、mod_jkが介在しないと起きないので、mod_jkのせいのような気もしますが。ちなみに、mod_jk v1.2.5のビルドに失敗したので、バイナリで持ってきたmod_jk v1.2.4で確認しました。
しかし、これって仕様なんでしょうか...?
これってServlet界の常識なんでしょうか...?
まあ、いまだにTomcat3.2.4+mod_jkとか使ってるのが良くないのかも知れませんが。

こんなの気付かねーぞ〜〜〜〜!!

(11/14 21:00追記)


あー、OSについて記述してませんでした。すみません。
OSは、Vine Linux2.1.5(RedHat6.2ベースらしい)です。
ちょっと古いのはSCOの訴訟対策です。(うそ
(11/17追記)


[jk_ajp12_worker.c (503)]: ajpv12_handle_response, error reading header line
mod_jkのログにはこんなものが。あー、以前バイナリで持ってきた、mod_jkが古いのかな〜

は〜、こんなとこでハマってる場合じゃないけど、mod_jkを新しくビルドしてみるかなあ。(じゃかるたのサイトにLinux版バイナリのmod_jkがないので。


しかし最近、よく細かい問題でハマってるような...


参考URL:


JakartaのサイトにLinux版バイナリのmod_jkがないってのは、ウソでした。ありました。

例えばこの辺です。

の、Tomcat Web Server Connectorsから辿るとなぜかないのですが...

ちなみに、ソースで持って来た
jakarta-tomcat-connectors-jk-1.2-src-current.tar.gz
(解凍すると、jakarta-tomcat-connectors-jk-1.2.5-src)
の、ビルドは、今のところうまくいってません。(makeもantも途中で失敗する。

(11/14加筆修正)