Spring MVCプロジェクトのIEエクスポートレポートはダウンロードできません

2867 ワード

最近、再構築されたシステムがオンラインになった後、お客様はIE 6を使用してレポートをダウンロードできないことを発見しました.具体的には「名前を付けて保存」ダイアログボックスがポップアップできますが、レポート名は表示されません.保存をクリックしてエラーを報告し、ダウンロードできません.しかし、私のWIN 7ノートパソコンではIE 9とFirefoxを使っても正常にダウンロードでき、同僚のWIN 7の下の検索ブラウザを使っても正しくダウンロードできます.プロジェクトのSpringバージョンを3.0から変更したためです.5.RELEASEは3.1にアップグレードされた.0.RC 1なので、Springフレームワークの内部の問題だと思っていましたが、比較した新しい古いコードの後に問題が発見されませんでした.新しいバージョンのコードにはsessionタイムアウトを検出するブロックが1つ増えています.その中にキーコードがあります.
 
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", -1);

 
なぜこのように書くのかは私のこの博文を参照してください.
まず、レポートのエクスポート原理を簡単に説明します.Excelにテンプレートを描き、「xmlテンプレート」として保存します.その後、xmlの内容をjspファイルにコピーし、jstlサポートを追加してjspファイルを動的化します.ユーザーがurlにアクセスすると、control側が処理して実行します.
 
response.setHeader("Content-Disposition", "attachment; filename=    .xls");

 
ユーザーブラウザに[名前を付けて保存](Save As)ダイアログボックスをポップアップさせ、保存するとこのjspファイルをxlsという接尾辞付きexcelファイルにします(本質はテキストファイルです).
エクスポート・レポートに戻り、jmeterツールを使用してurlリクエストを送信したサンプラの結果には、次のセクションが含まれます.
 
Thread Name:     1-1
Sample Start: 2011-10-26 13:38:23 CST
Load time: 5253
Latency: 31
Size in bytes: 12414200
Sample Count: 1
Error Count: 0
Response code: 200
Response message: OK

Response headers:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Expires: Thu, 01-Jan-1970 00:00:00 GMT
Content-Disposition: attachement; filename=excel.xls
Content-Language: zh-CN
Content-Type: application/vnd.ms-excel;charset=gb2312
Set-Cookie: JSESSIONID=e1uhcjpgko27zheg3bfajw6y;Path=/lmkweb
Transfer-Encoding: chunked
Server: Jetty(7.2.0.v20101020)


HTTPSampleResult fields:
ContentType: application/vnd.ms-excel;charset=gb2312
DataEncoding: gb2312

インターセプターのno-cacheというコードを外すと、IE 6で正しくダウンロードできるようになったので、responseのヘッダのCache-controlとContent-Dispositionが衝突したと思われる(IE 6、IE 7など)が、下位の詳細は不明(WIN 7のIE 9とFirefoxは質問なし).
 
また、テストコードを书くときに、このレポートファイルが非常に小さい场合は、IEの保存ダイアログボックスがポップアップされるとバイト数が表示され、非常に大きい场合は、ポップアップダイアログボックスがバイト数を表示しないで、ダウンロードの途中でダウンロードした回数、ダウンロード速度などが表示されます.
今回はテストのjspファイルに
 
<% 
for (int i = 0; i < 10000; i++) {
	System.out.println("[" + i + "]");
%>   

...

<% 
}
%>

ブラウザでテストしたところ、コンソールが70前後に印刷されると出力されなくなり、ページがダイアログボックスとしてポップアップされ、保存をクリックすると、コンソールが印刷を開始することが分かった.jmeterテストではこのような一時停止は存在しません.ブラウザがjspファイルを保存するときにキャッシュメカニズムがあるべきだと初歩的に考えられていますが、とても面白いです.