2013-11-15 79 views
2

我們有一個基於portlet的應用程序,它檢索某個cookie進行驗證,然後發送一個操作請求。HttpServletRequest不返回cookie - 但它們存在

但是,我們發現HttpServletRequest正在返回一個空的Cookie列表 - 儘管我可以100%確認存在Cookie。事實上,有時代碼會工作並顯示cookie(儘管這很少見)。

我們注意到IE看起來比FF和Chrome更頻繁地工作,但是再一次沒有一致性或模式來確定導致它起作用的原因。

總是獲取請求 - 這裏從來沒有一個空指針的問題。此時唯一的問題是cookie列表爲空。在靜態類

方法返回來自其它類的HttpServletRequest

FacesContext context = FacesContext.getCurrentInstance(); 
    Map<String, Object> requests = context.getExternalContext().getRequestMap(); 
    for (String requestName : requests.keySet()) { 

     if (requests.get(requestName) instanceof HttpServletRequest) { 
      return ((HttpServletRequest) requests.get(requestName)); 
     } 
    } 
    return null; 

呼叫上述靜態方法:

 Cookie[] cookies = StaticClass.getHttpRequest().getCookies(); 
     System.out.println("Cookies = " + cookies); 
+0

忘記了一段時間的Java代碼,並開始檢查HTTP流量。爲什麼最終用戶瀏覽器不發送cookie?你如何設置它們? – eis

+0

當你有這個問題時,也可以在問題中添加相關信息。 – eis

回答

0

HttpServletRequest的方法的getCookies()應返回的數組客戶在請求中發送的Cookie。如果返回的數組爲null,則表示客戶端發送的請求不包含cookie。您是否在相同的域或子域中調用addCookie(yourCookie)方法(我問你不能在不同的域中訪問Cookie)?

即:
Cookie yourCookie = new Cookie(name, value);
response.addCookie(yourCookie);

如果沒有添加到以前的響應中的Cookie,也不會在該請求。

+0

這個特殊的cookie是通過我們使用的第三方Javascript調用添加的。該cookie在那裏 - 但不是在請求中添加的? – user2124871

+0

@ user2124871,請檢查cookie路徑,請求uri應該匹配它。嘗試將coookie路徑設置爲「/」以用於測試目的。 – Osw

+0

@ user2124871,這聽起來像你使用第三方JavaScript來直接在瀏覽器中設置cookie。如果是這種情況,那麼就像Osw說的那樣,檢查cookie路徑和域名。同時檢查以確定cookie實際上在瀏覽器中。 cookie將被髮送到服務器的請求的唯一方式是,如果瀏覽器被用戶指向與cookie中設置的完全相同的路徑和域。一旦cookie重新發送到服務器,它就可以通過getCookies()方法訪問。 –

0

其他一些線索:

  1. 檢查Cookie的最大年齡。 Cookie可能已過期。
  2. 檢查cookie的域名和請求URL的域名。如果你不確定,請在這裏發帖尋求幫助。

一般情況下,如果您可以捕獲http請求消息並將其發佈到此處,它也將有所幫助。

更新:在Firefox中,你可以右鍵點擊一個頁面,選擇'查看頁面信息',然後選擇'安全'選項卡,點擊'查看cookies'按鈕查看所有的cookie。您也可以在彈出窗口中更改域名以查看其他域下的cookie。

相關問題