SessionID的本質(zhì)
一、客戶端用cookie保存了sessionID
客戶端用cookie保存了sessionID,當(dāng)我們請(qǐng)求服務(wù)器的時(shí)候,會(huì)把這個(gè)sessionID一起發(fā)給服務(wù)器,服務(wù)器會(huì)到內(nèi)存中搜索對(duì)應(yīng)的sessionID,如果找到了對(duì)應(yīng)的 sessionID,說明我們處于登錄狀態(tài);如果沒找到,這說明:要么是我們把瀏覽器關(guān)掉了,要么session超時(shí)了,session被服務(wù)器清除了,則服務(wù)器會(huì)給你分配一個(gè)新的sessionID。你得重 新登錄并把這個(gè)新的sessionID保存在cookie中。
在沒有把瀏覽器關(guān)掉的時(shí)候(這個(gè)時(shí)候假如已經(jīng)把sessionID保存在cookie中了)這個(gè)sessionID會(huì)一直保存在瀏覽器中,每次請(qǐng)求的時(shí)候都會(huì)把這個(gè)sessionID提交到服務(wù)器,所以服務(wù)器認(rèn)為我們是登錄的;如果長(zhǎng)時(shí)間沒有請(qǐng)求服務(wù)器,服務(wù)器會(huì)認(rèn)為我們已經(jīng)把瀏覽器關(guān)掉了,這個(gè)時(shí)候服務(wù)器會(huì)把該sessionID從內(nèi)存中清除掉,這個(gè)時(shí)候我們?cè)偃フ?qǐng)求服務(wù)器的話,sessionID已經(jīng)不存在了,服務(wù)器在內(nèi)存中沒有找到對(duì)應(yīng)的 sessionID,所以會(huì)再產(chǎn)生一個(gè)新的sessionID,這個(gè)時(shí)候一般我們又要再登錄一次。
二、客戶端沒有用cookie保存sessionID
這 個(gè)時(shí)候如果我們請(qǐng)求服務(wù)器,因?yàn)闆]有提交sessionID上來,服務(wù)器會(huì)認(rèn)為你是一個(gè)全新的請(qǐng)求,服務(wù)器會(huì)給你分配一個(gè)新的sessionID,這就是 為什么我們每次打開一個(gè)新的瀏覽器的時(shí)候(無(wú)論之前我們有沒有登錄過)都會(huì)產(chǎn)生一個(gè)新的sessionID(或者是會(huì)讓我們重新登錄)。
當(dāng)我們一旦把瀏覽器關(guān)掉后,再打開瀏覽器再請(qǐng)求該頁(yè)面,它會(huì)讓我們登錄,這是為什么?我們明明已經(jīng)登錄了,而且還沒有超時(shí),sessionID肯定還在服 務(wù)器上的,為什么現(xiàn)在我們又要再一次登錄呢?這是因?yàn)槲覀冴P(guān)掉瀏覽再請(qǐng)求的時(shí)候,我們提交的信息沒有把剛才的sessionID一起提交到服務(wù)器,所以服 務(wù)器不知道我們是同一個(gè)人,所以這時(shí)服務(wù)器又為我們分配一個(gè)新的sessionID。

1、server通過HTTP Response中的"Set-Cookie: header"把cookie發(fā)送給client
2、client把cookie通過HTTP Request 中的“Cookie: header”發(fā)送給server
3、每次HTTP請(qǐng)求,Cookie都會(huì)被發(fā)送。
http請(qǐng)求發(fā)送cookies的條件:
1、本地已經(jīng)緩存有cookies
2、根據(jù)請(qǐng)求的URL來匹配cookies的domain、path屬性,如果都符合才會(huì)發(fā)送。[url的匹配規(guī)則]
iOS客戶端:cookies會(huì)保存在App的沙盒下
退出登錄(清除Cookie)
+ (void)exitCleanCookies{
//Host : http://cart.ev.com/cart-admin/
//獲取BaseUrl 的Cookie
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL: [NSURL URLWithString:Host]];
for (NSHTTPCookie * cookie in cookies){
//清除本地的Cookie (退出登錄)
[[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
}
}
Cookie信息:
<NSHTTPCookie version:0 name:"JSESSIONID" value:"7DD6A8E30F40E1D8515DB3A39FBF32C3"
expiresDate:(null) created:2017-03-22 06:46:49 +0000 sessionOnly:TRUE
domain:"cart.ev.com" partition:"none" path:"/cart-admin" isSecure:FALSE>
存儲(chǔ)獲取到的Cookie
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
NSData * cookiesData = [NSKeyedArchiver archivedDataWithRootObject: cookies ];
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject: cookiesData forKey:kCookie];
[defaults synchronize];
設(shè)置本地的Cookie
NSData *cookieData = [[NSUserDefaults standardUserDefaults] objectForKey:kCookie];
NSArray * cookies = [NSKeyedUnarchiver unarchiveObjectWithData: cookieData];
NSHTTPCookieStorage * cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie * cookie in cookies){
[cookieStorage setCookie: cookie];
}
給鏈接設(shè)置Cookie
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
[cookieStorage setCookies:cookies forURL:url mainDocumentURL:nil];
客服端創(chuàng)建Cookie
NSHTTPCookie *cookie = [[NSHTTPCookie alloc] initWithProperties:@{NSHTTPCookieName:@"username",
NSHTTPCookieValue:@"test",
NSHTTPCookiePath:@"/",
NSHTTPCookieDomain:@"https://www.baidu.com"}];
NSHTTPCookieStorage * cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
[cookieStorage setCookies:@[cookie] forURL:baseUrl mainDocumentURL:nil];