簡體   English   中英

在Java中管理會話Cookie

[英]Managing session cookies in Java

我正在一個Java Web應用程序中工作,該應用程序不應允許用戶在2個不同的選項卡中打開它,而我正在為此使用會話cookie。 在大多數情況下,它似乎都可以正常工作,但是問題是,當瀏覽器退出時,不會清除cookie。 這是我設置Cookie的方法:

String sCookie = "mycookie=true;Path=/;Domain=.mydomain.com;HttpOnly";
        if (!response.containsHeader("Set-Cookie")) {
            response.setHeader("Set-Cookie", sCookie);
        } else {
            response.addHeader("Set-Cookie", sCookie);
        }

據我了解,如果未指定Expires字段,則應在瀏覽器關閉時刪除Cookie。 這是我驗證Cookie是否存在的方法:

Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if ("mycookie".equals(cookie.getName()) && Boolean.valueOf(cookie.getValue())) {//some error}}

這段代碼有什么問題嗎? 意思是,我可以使用response.setHeader設置cookie,然后使用request.getCookies()檢查它嗎? 有時我在手動刪除Cookie時遇到問題,然后在重新啟動瀏覽器時問題仍然存在。

這是我手動刪除Cookie的方式(在選項卡關閉時):

String sCookie = "mycookie=;Path=/;Domain=.mydomain.com;HttpOnly";
        if (!response.containsHeader("Set-Cookie")) {
            response.setHeader("Set-Cookie", sCookie);
        } else {
            response.addHeader("Set-Cookie", sCookie);
        }

提前致謝
UPDATE
這是我創建Cookie的方法:

Cookie c = new Cookie("mycookie","true");
        c.setDomain(".mydomain.com");
        c.setPath("/");
        c.setValue("true");
        response.addCookie(c);


這是刪除Cookie的方法:

for (Cookie c : request.getCookies()) {
            if ("mycookie".equals(c.getName())) {
                c.setMaxAge(0);
                c.setValue("");
            }
        }


但仍然無法正常工作。 實際上,現在我關閉選項卡時未刪除cookie(在我以前的版本中使用“ Set-Cookie”:S可以正常工作)。另一個細節是我沒有在Chrome開發人員的“資源”選項卡中看到cookie。工具

作為一般提示,您最好使用response.addCookie(..)方法,並可能使用Cookie.setMaxAge(-1)

就是說,這應該是默認設置,因此為了理解問題,您應該使用Firebug(或任何瀏覽器開發人員工具)檢查Cookie並檢查其最長期限。 關閉瀏覽器之前和之后。 例如,您可能有一些剩余的cookie。

實際上,您應該以不同的方式設置Cookie:

Cookie myCookie = new Cookie();  // create your cookie
// set path, and other attributes you need

// add the cookie to the response
response.addCookie(myCookie);

然后使Cookie過期:

myCookie.setMaxAge(0);

另外,為了徹底清潔:

myCookie.setValue("");
myCookie.setPath("/");

因此,您必須獲取請求中的所有cookie,識別您的cookie並使用類似以下內容的方法對其進行清理:

List<Cookie> cookies = request.getCookies();

for (Cookie cookie : cookies) {
    // identify your cookie
    if (identified) {
        cookie.setMaxAge(0);
        cookie.setValue("");
        cookie.setPath("/");
    }
}

如果cookie.getName("Set-Cookie")與您的Cookie不匹配,請調試代碼以查看在response.setHeader("Set-Cookie", sCookie);分配了什么名稱response.setHeader("Set-Cookie", sCookie);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM