更新:問題與用於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;
}
}
這是太多的代碼來限制。我非常確定,超過90%的代碼與具體問題無關。請拿出儘可能最小但自包含的代碼片段,它仍然會重現您的問題。你一直沒有告訴你如何得出結論,沒有設置cookie。它在響應頭中是否丟失?還是在後續請求的請求頭中缺少? – BalusC
已編輯 - 希望它更清晰。 – boyd4715