首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Web 獲取真實路徑的最佳實踐與陷阱

     編輯:Java 相關知識

常見獲取路徑的方法

在 Servlet 容器中獲取 Web 應用的絕對物理路徑,主要有以下幾種方式:

  • request.getRealPath() —— 已過期,不推薦使用
  • this.getServletContext().getRealPath() —— 標準 Servlet 寫法
  • this.getServlet().getServletContext().getRealPath() —— Struts 1 時代常用
  • request.getSession().getServletContext().getRealPath() —— 通用但有隱患

核心問題:EAR 多模塊會話共享導致路徑錯亂

當一個 EAR 包含多個 WAR 模塊並配置了會話共享時,request.getSession() 可能返回其他模塊的 Session,進而導致 getServletContext() 指向錯誤的 Web 應用上下文,最終獲取到錯誤的絕對路徑。

推薦方案

始終使用 this.getServlet().getServletContext().getRealPath() 或 getServletContext().getRealPath()。這兩種方式直接綁定當前 Servlet 所屬的 Web 應用上下文,不受 Session 共享影響。

代碼對比

// ❌ 風險寫法:EAR 多模塊共享 Session 時可能取錯路徑
String badPath = request.getSession().getServletContext().getRealPath("/upload");

// ✅ 安全寫法:綁定當前 Servlet 的上下文
String goodPath = getServletContext().getRealPath("/upload");
// 或在 GenericServlet/HttpServlet 子類中
String goodPath2 = this.getServletContext().getRealPath("/upload");

補充建議

  1. 避免硬編碼路徑,優先使用相對路徑或配置屬性。
  2. Spring 應用中可注入 ServletContext 或使用 ResourceLoader 獲取資源。
  3. 文件上傳目錄建議配置在容器外部,避免重新部署丟失。

總結

理解 ServletContext 與 Session 的生命週期差異,是避免路徑獲取錯誤的關鍵。堅持使用當前 Servlet 綁定的 ServletContext,能從根源上消除多模塊部署帶來的路徑混亂風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved