2011-09-07 58 views
1

我在Servlet中正確設置(持久/跨瀏覽器會話)cookie的數據並在過濾器中讀取數據時遇到問題。使用Servlet處理Cookie

了Servlet的代碼(在登錄時間運行)是:

String encodedValue = new String(Base64 
     .encodeBase64(req.getParameter("account").getBytes())); 
    Cookie cookie = new Cookie("projectAuthenticationCookie", encodedValue); 
    cookie.setMaxAge(24*60*60); 
    cookie.setPath("/"); 
    res.addCookie(cookie); 

這將得到響應裏面的餅乾,但是當我我用下面的代碼過濾器中閱讀:

Cookie authenticationCookie = null; 
    Cookie[] cookies = ((HttpServletRequest) request).getCookies(); 
    for (Cookie cookie : cookies){ 
     if ("projectAuthenticationCookie".equals(cookie.getName())) { 
      authenticationCookie = cookie; 
     } 
    } 

我只獲得我設置的值,其他所有的字段都是空的,空的或不同的。例如最大年齡總是返回-1,因此cookie將永遠不會持續。

cookie return values

我試圖設置過期頭:

res.setDateHeader("Expires", System.currentTimeMillis() + 24*60*60*1000); 

,因爲我讀,如果沒有一個有效的到期頭會話將反正超時(糾正我,如果我錯了),但這並沒有幫助...

一個問題我想的是,我在本地主機上運行(嘗試設置cookie.setDomain(「localhost」的),但也沒有運氣)。我的網絡服務器/ serclet容器是Jetty 7,但我認爲這不相關...

任何提示?

+0

爲什麼你在過濾器中需要這些信息?如果maxage已過期,那麼客戶端將不會發回cookie。你只需要檢查服務器是否存在,而不需要知道它是否仍然有效。 – BalusC

回答

6

除了名稱和值之外的其他字段未填充(因此無意義)您從請求中獲得的Cookie。

這些字段旨在告知瀏覽器最大年齡;路徑等,但瀏覽器不會將此信息發送回服務器。只有當您創建cookie並將其添加到響應時,纔有正確的最大年齡,路徑等是非常重要的。使用瀏覽器檢查它是否存儲了正確的信息,而不是在服務器端嘗試找到它。