開発者からPDFが出ないという報告があったので、調査した。
PDFを出すために、
<embed src="hoge.do" width="100%" height="100%"></embed>
という風にタグを書いていた。
通信を見ていると、なぜかhoge.doに2回リクエストが来るという現象だった。
1回目のリクエストは、User-Agentが"contype"となったリクエスト。
2回目は普通のリクエスト。
どうやら、コンテントタイプを一回調べに来るらしい。
アプリ側では初回のリクエスト時にPDFを返していて、2回目の時にはもうPDF出しましたというエラーを返していたので、ブラウザ側でPDFが来たことにならなかったらしい。
なので、首をかしげながら
public void doFilter(...){ String agent = request.getHeader("User-Agent"); if(agent != null && agent.equels("contype")){ response.setContentType("aapplication/pdf"); return; }else{ filterChail.doChain(... } }
的なフィルターを書いた。
が、それでもだめだった。
PDFは出たものの、embedを書いたHTMLにdocumentのonload処理を書いていたのだが、1回目のリクエストのレスポンスが帰ってきた時点でonloadが呼ばれてしまっていて、挙動が変になってしまった。
で、よく考えたらコンテントタイプ指定しとけば聞きに来ないんじゃない?と思い
<embed type="application/pdf" src="hoge.do" width="100%" height="100%"></embed>
としたら治った。
AdobeGJ。
追記:
って今もう一度調べたら、やはりonloadはPDF出力を待ってくれなかったorz
ということで
<iframe width="100%" height="100%" src="hoge.do"/>
でやったらうまく行った。
むしろこっちならエラー時にHTMLとかだせるし便利と思った次第。