在 Java Web 專案中,文件下載是高頻需求。除了在代碼層面通過 Servlet/Struts2/SpringMVC 實現,Tomcat 容器本身作為 HTTP 服務器,具備直接映射靜態資源的能力。合理利用此特性,可大幅簡化開發工作量。本文將介紹如何配置 Tomcat 實現文件下載、關閉目錄瀏覽風險、解決中文文件名亂碼三大核心場景。
download_file,專門存放供下載的文件。https://localhost:8080/專案名/download_file/文件名.副本名 即可觸發下載。此方式無需編寫任何 Java 代碼,Tomcat 的 DefaultServlet 會自動處理靜態資源請求,設置適當的響應頭實現下載。
若用戶訪問 https://localhost:8080/專案名/download_file/(不帶具體文件名),Tomcat 默認會返回該目錄下的文件列表頁面(目錄遍歷),導致敏感文件暴露,存在嚴重安全隱患。
找到 Tomcat 安裝目錄下的 conf/web.xml,定位 default Servlet 定義,將 listings 參數值改為 false:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
修改後需重啟 Tomcat 生效。 此舉將禁用目錄瀏覽功能,用戶訪問目錄 URL 時將收到 404 錯誤而非文件列表。
當下載文件名包含中文時,Tomcat 默認使用 ISO-8859-1 解碼 URL 路徑,導致找不到對應文件(404)或文件名顯示亂碼。
在 <Connector> 標籤中添加 URIEncoding="UTF-8" 屬性(建議同時啟用 disableUploadTimeout="true"):
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1"
redirectPort="8443" disableUploadTimeout="true" URIEncoding="UTF-8"/>
此配置強制 Tomcat 使用 UTF-8 解碼請求 URI(含查詢字符串與路徑參數),完美解決中文文件名識別問題。
修改 Tomcat 配置文件後,若在 Eclipse 中重啟 Server 無效,常見原因是 Eclipse 使用的是 Tomcat 的副本配置。解決步驟:
Cache-Control、ETag 優化重複下載性能。掌握 Tomcat 原生下載特性與安全配置,能讓你在輕量級場景下快速交付功能,同時避免常見安全陷阱。對於複雜業務場景,建議結合應用層框架實現更精細的控制。