Java文件下載在chrome瀏覽器報錯問題


在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中添加一些屬性,造成不可預知的后果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM