今天遇到一個(gè)Cookie的問題,cookie的path不是 '/',導(dǎo)致一些頁面不能共享Cookie。之前沒有遇到過這個(gè)問題,今天就查了查。
在項(xiàng)目中有時(shí)需要用cookie來保存用戶信息,很多時(shí)候我們都只設(shè)置了cookie的name、value和maxAge,而沒有去管path。
path取值是有默認(rèn)規(guī)則的,下面總結(jié)一下paht取值的規(guī)則。
總結(jié)一下paht取值的規(guī)則:
- 當(dāng)cookie的path設(shè)置了值不為null的時(shí)候,以設(shè)置的值為準(zhǔn)。
- 當(dāng)cookie的path為null時(shí)候,獲取請(qǐng)求的URI的path值
1). 當(dāng)URI的path值是以“/”結(jié)尾的時(shí)候,直接設(shè)置為cookie的path值
2). 當(dāng)URI的path值不是以“/”結(jié)尾的時(shí)候,查看path里面是否有“/”
(1). 如果有“/”的話,直接截取到最后一個(gè)“/”,然后設(shè)置為cookie的path值。
(2). 如果沒有“/”的話,將cookie的path設(shè)置為”/”。
示例:
代碼1是當(dāng)一個(gè)用戶首次訪問網(wǎng)站的時(shí)候添加一個(gè)cookie(假設(shè)網(wǎng)站的域名是www.a.com)用來表示用戶是未登錄的新用戶。
代碼1
.........過濾器中其他代碼,判斷用戶是否首次訪問網(wǎng)站........
Cookie newVisitorCookie = new Cookie("new_visitor", "yes");
newVisitorCookie.setMaxAge(-1);
newVisitorCookie.setDomain("www.a.com");
response.addCookie(newVisitorCookie);
.........其他代碼...........
在java代碼里面通過name為“new_visitor”的cookie來判斷用戶是否是首次訪問。
通過測(cè)試發(fā)現(xiàn)有些用戶雖然是首次訪問網(wǎng)站,但是在java代碼里面卻獲取不到“new_visitor”的cookie。經(jīng)過排查才發(fā)現(xiàn)原來是cookie中path屬性的問題。
path表示cookie所在的目錄。
”/”表示根目錄,所有頁面都能訪問根目錄下面的cookie。
如果cookie的path為test,那么只test目錄下或者是test下的子目錄的頁面和代碼才獲取到這個(gè)cookie。
查看了一下添加cookie的源代碼才發(fā)現(xiàn),當(dāng)cookie的path為null的時(shí)候,會(huì)自動(dòng)設(shè)置path的值。
代碼2是java.net.CookieManager類中當(dāng)cookie的path為null時(shí),設(shè)置path值的規(guī)則。
代碼2
...............其他代碼................
for (String headerValue : responseHeaders.get(headerKey)) {
try {
List<HttpCookie> cookies = HttpCookie.parse(headerValue);
for (HttpCookie cookie : cookies) {
if (cookie.getPath() == null) {
// If no path is specified, then by default
// the path is the directory of the page/doc
String path = uri.getPath();
if (!path.endsWith("/")) {
int i = path.lastIndexOf("/");
if (i > 0) {
path = path.substring(0, i + 1);
} else {
path = "/";
}
}
cookie.setPath(path);
}
...............其他代碼................