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

Servlet Cookie 設定與獲取陷阱:localhost vs 127.0.0.1 域名差異

     編輯:Java 相關知識

問題現象

部署於本地 8080 端口,邏輯:無 Cookie 則下發、有則複用。以 localhost:8080 訪問正常,Cookie 共享;以 127.0.0.1:8080 訪問每次 Cookie 皆不同,無法獲取先前設定值。

根因分析

  • 瀏覽器以 host + port 作為 Cookie 域隔離依據。
  • localhost:8080 下發 Cookie 域為 localhost。
  • 127.0.0.1:8080 下發 Cookie 域為 127.0.0.1:8080(含端口),導致 Servlet request.getCookies() 永遠讀不到。
  • 容器自動生成的 JSESSIONID 域為 127.0.0.1(不含端口),故 Session 正常。

問題代碼

String host = request.getHeader("host"); // 可能包含 "127.0.0.1:8080"
Cookie cookie = new Cookie("uid", uid);
cookie.setDomain(host); // 錯誤:包含端口
cookie.setMaxAge(93312000);
response.addCookie(cookie);

解決方案

String host = request.getHeader("host");
if (host.indexOf(":") > -1) {
    host = host.split(":")[0]; // 去除端口,僅保留域名/IP
}
cookie.setDomain(host);
// 或直接不調用 setDomain(),瀏覽器預設為當前 host(不含端口)

最佳實踐建議

  • 生產環境務必使用正式域名(如 app.example.com),避免 IP/localhost 混用。
  • 若必須支援 IP 訪問,統一不設定 Domain,讓瀏覽器自動處理(同源策略下同 IP 不同端口仍會隔離,需注意)。
  • 設定 setPath("/") 確保全路徑共享。
  • HTTPS 環境下添加 setSecure(true)、setHttpOnly(true) 提升安全性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved