在struts2做Excel下載時,IE沒問題,但在chrome中有如下問題:
收到了來自服務器的重復標頭 來自服務器的響應包含重復標頭。此問題通常是由於網站或代理配置不正確導致的。只有網站或代理管理員才能解決此問題。 錯誤 349 (net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION):我們收到了多個截然不同的“Content-Disposition”標頭。我們不允許此行為,以防遭到 HTTP 響應拆分攻擊。
經過檢查,在代碼中的response頭信息是:
super.getResponse().addHeader("Content-Disposition","attachment; filename="+someFile.getName()+ ".xls");
struts2的配置:
<action name="export_Excel" class="dataAction" method="export_Excel"> <result type="stream"> <param name="inputName">excelFileData</param> <param name="contentType">application/vnd.ms-excel</param> <param name="contentCharSet">UTF-8</param> </result> </action>
此時的response信息:
對照上面的配置,響應頭的Content-Disposition莫名其妙多了一個inline的value。
根據chrome的提示,google一把,有人建議在struts2的result中設置好Content-Disposition而不是在Java中。
照建議嘗試:新增Content-Disposition信息,刪除在程序中的設置。另外struts2的Action中新增fileName屬性,並為其添加getter。
經過修改:
<action name="export_Excel" class="dataAction" method="export_Excel"> <result type="stream"> <param name="inputName">excelFileData</param> <param name="contentType">application/vnd.ms-excel</param> <param name="contentCharSet">UTF-8</param> <param name="contentDisposition">attachment; filename=${fileName}</param> </result> </action>
Action新增fileName屬性,並在構建Excel IO時初始化fileName:
private String fileName; public String getFileName() { return fileName; }
再次嘗試就OK了,修改后的響應頭:
總結:
使用struts2下載時,不像之前在servlet中那樣直接寫response的頭信息,而是在result中配置,否則struts2可能會自動在response中添加一些屬性,造成不可預知的后果。