2009-06-23 100 views
14

我在使用Tomcat上的Servlet API 2.5的Cookie類時遇到問題。我拔出從HttpServletRequest對象的cookie的列表,並在它們之間迭代,像這樣:Java Servlet API 2.5 Cookie.getDomain()總是返回null

Cookie[] cookies = request.getCookies(); 

for(Cookie cookie : cookies) { 
    System.out.println("Name=" + cookie.getName() + " Domain=" + cookie.getDomain()); 
} 

然而,在請求每一個cookie的域名爲空。爲什麼是這樣?我問的原因是因爲我在兩個不同的域名中擁有相同名稱的cookie,我希望能夠根據域名區分它們。爲了澄清這種情況,我在.anydomain.net和.subdomain.anydomain.net中設置了相同名稱的Cookie。兩者都在請求中發送,但域到達servlet時爲空。預計該servlet無法看到發送給它的cookie的域的行爲?

編輯:我在之前的servlet請求中設置了cookie,域,過期和路徑。使用這些cookie進入瀏覽器的下一個請求顯示域爲空。我已驗證Cookie正在設置在瀏覽器的正確域中。

編輯2:我使用的是Tomcat 6

+0

您可以在setName()和setDomain()方法上設置斷點,以檢查servlet容器是否正確解析cookie標頭。你的cookie中有冒號(:)嗎?最近的一些Tomcat版本不接受大多數帶有冒號的cookie。 – akarnokd 2009-06-23 21:58:51

回答

22

你確定,你可以得到除了從請求中的Cookie值什麼? 瀏覽器只會在HTTP Cookie標頭中發送name = value。

其他屬性(安全,域,路徑,過期)僅適用於您自己設置爲響應的cookie。 它們用於創建Set-Cookie響應標頭。

7

像域這樣的屬性只用於cookie,當它是響應的一部分時(即在Set-Cookie頭中)。客戶端(例如網絡瀏覽器)只應發送具有正確域名(路徑等)的cookie。因此,請求只能看到值,因爲頭本身(Cookie)只包含值。您的客戶不應該將來自不同域的cookie發送到服務器。