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

Java JSP 開發實戰筆記:資源路徑、IP 獲取與 Ajax 請求

     編輯:Java 綜合教學

Java JSP 開發實戰筆記:資源路徑、IP 獲取與 Ajax 請求

記錄 JSP/Servlet 開發中常遇到的三個實戰問題與解決方案,涵蓋靜態資源路徑解析、跨平台 IP 獲取 Bug 修復、以及 Ajax 請求方法支援配置。

一、JSP 專案中正確載入靜態資源(圖片、CSS、JS)

將靜態 HTML 直接複製到 JSP 時,相對路徑常失效。需動態取得專案上下文路徑構建基礎 URL。

核心程式碼片段

<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" 
                    + request.getServerName() + ":" 
                    + request.getServerPort() + path + "/";
%>
<img src="<%=basePath%>/Icons/VerifyCode.png" />

JSP 路徑配置示意

關鍵點:basePath 包含協定、域名、埠號與專案名,確保任何目錄層級的 JSP 都能正確定位資源。

二、Servlet 獲取客戶端真實 IP 的跨平台 Bug 與修復

在 Mac OS 開發環境下,標準 IP 獲取鏈條最後回退到 InetAddress.getLocalHost().getHostAddress() 時會拋出異常:this web application instance has been stopped already. Could not load [java.net.InetAddress]。

問題程式碼

String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("Proxy-Client-IP");
}
// ... 多層代理頭檢查 ...
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getRemoteAddr();
}
if ("127.0.0.1".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) {
    try {
        ip = InetAddress.getLocalHost().getHostAddress(); // 這行在 Mac Tomcat 會炸
    } catch (UnknownHostException e) { }
}

解決方案:配置 Tomcat server.xml

在 <Host> 節點下添加 <Context> 明確指定專案路徑,避免類載入器問題:

<Context path="/Servlet" docBase="/Servlet" debug="0" reloadable="true"/>

server.xml 配置示意

原理:明確部署上下文讓類載入器正確初始化,避免應用已停止卻仍嘗試載入類的競態條件。

三、Ajax 請求 Servlet 時 405 錯誤:GET/POST 方法支援配置

錯誤訊息:Request method 'POST' not supported。原因是 Servlet 僅實作 doGet() 或 doPost(),而前端 Ajax 使用對方未支援的方法。

解決策略

  • 雙支援:在 doGet() 呼叫 doPost(),或反之,統一邏輯入口。
  • 安全建議:敏感介面僅開放 POST,避免參數暴露在 URL 中被瀏覽器歷史/日誌記錄。

程式碼範例

@WebServlet("/api/user")
public class UserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
        // 核心業務邏輯
    }
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        // 安全考量:GET 僅轉發或拒絕
        // doPost(req, resp); // 若需支援 GET
        resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
    }
}

Ajax 405 錯誤示意

總結

JSP/Servlet 開發雖屬傳統技術,但在維護舊系統或嵌入式場景仍常見。掌握動態路徑構建、跨平台 IP 獲取容錯、RESTful 風格的方法限制三大實戰技巧,能顯著減少部署環境差異導致的疑難雜症。

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