2011-10-21 24 views
1

更新:問題與用於MaxAge的設置有關。將其設置爲零將導致Cookie被刪除,因此它顯示在響應標題中,但之後被刪除並且未顯示在請求中。將其設置爲-1,以便它不會被永久存儲使用過濾器將cookie添加到用戶會話

我正在做一些篩選器的工作,我希望它設置一個cookie來表明用戶有資格接受調查,並且下一次他回到該網站將顯示一個調查彈出窗口。

我沒有在日誌中看到任何錯誤,但cookie從未設置。

過濾器是否可以用這種方式添加cookie? HttpServletResponseWrapper在哪裏發揮作用?

這裏的想法是,當用戶訪問該網站時,檢查cookie是否存在。如果不是,則創建cookie並將其添加到響應中。在用戶瀏覽該網站時,會調用cookie檢查方法以確保該給定用戶的計數器不會增加。

Cookie檢查方法從不會看到cookie。使用Firefox的網頁開發者插件,相關的cookie不存在。

下面是帶有相關方法的過濾器類。

public class HitCounterFilter extends TemplateFilter { 
    public void doMainProcessing(ServletRequest pRequest, ServletResponse pResponse, FilterChain pChain) { 
     HttpServletRequest httpRequest = (HttpServletRequest) pRequest; 
     HttpServletResponse httpResponse = (HttpServletResponse) pResponse; 

     // prevent thread interference and memory consistency errors 
     synchronized (lock) { 
      int hitCounter = this.readFile(localFile); 

      // if user has not been counted 
      if (!this.checkForCookie(httpRequest, "gtgo_visitor")) { 
       this.writeFile(localFile, ++hitCounter); 
       this.createCookie(httpRequest, httpResponse, String.valueOf(hitCounter), "gtgo_visitor"); 
      } 
     } 
    } 

    private void createCookie(HttpServletRequest pHttpRequest, HttpServletResponse pHttpResponse, String pCookieValue, String pCookieName) { 
     try { 
      Cookie cookie = new Cookie(pCookieName, pCookieValue); 
      URL url = new URL(pHttpRequest.getRequestURL().toString()); 
      cookie.setDomain(url.getHost()); 
      cookie.setPath(this.getCookiePath(pHttpRequest)); 
      cookie.setComment("user is not eligible to take the survey this time"); 
      cookie.setMaxAge(0); 

      pHttpResponse.addCookie(cookie); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 
    } 

    private boolean checkForCookie(HttpServletRequest pHttpRequest, String pCookieName) { 
     for (Cookie cookie : pHttpRequest.getCookies()) { 
      if (StringUtils.equalsIgnoreCase(cookie.getName(), pCookieName)) { 
       return true; 
      } 
     } 
     return false; 
    } 
} 
+2

這是太多的代碼來限制。我非常確定,超過90%的代碼與具體問題無關。請拿出儘可能最小但自包含的代碼片段,它仍然會重現您的問題。你一直沒有告訴你如何得出結論,沒有設置cookie。它在響應頭中是否丟失?還是在後續請求的請求頭中缺少? – BalusC

+0

已編輯 - 希望它更清晰。 – boyd4715

回答

1

問題出在用於MaxAge的設置。將其設置爲零將導致Cookie被刪除,因此它顯示在響應標題中,但之後被刪除並且未顯示在請求中。將其設置爲-1,以便它不會永久存儲 - 只要會話處於活動狀態(會話關閉後刪除),它就會出現

0

我以前沒有和SCAM項目一起工作過,但它看起來就是你正在使用的。我不確定在調用FilterChain的doFilter方法之前,超類的doFilter實現是否調用了你的實現的doMainProcessing方法。

因爲框架將FilterChain傳遞到doMainProcessing方法中,所以它可能期望您的實現將調用pChain.doFilter(pRequest,pResponse,pChain)。

我可能對此有錯,但是如果過濾器鏈被放棄,那麼寫入ServletResponse對象(包括所附的cookie)的頭文件可能不會返回給客戶端。

在任何情況下,除非您明確禁止訪問請求的資源,否則明智地使用FilterChain傳播請求。

+0

包含命中計數器的文件正在更新 – boyd4715

+0

當您說「使用Firefox的Web開發人員插件時,相關Cookie不存在」。您是否意味着您正在檢查後續請求或來自應該設置它的請求的響應頭? – allingeek

+0

爲firfox使用相同的插件,我選擇查看響應頭,我看到以下內容:Set-Cookie:gtgo_visitor = 30;域本地主機=;到期日=星期四,1970年1月1日00:00:10 GMT; Path =/keurig所以這確實看起來好像在響應中設置了cookie。所以現在的問題是我如何訪問它 - 它不會出現在HttpServletRequest#getCookies – boyd4715

相關問題