iOS【Cookie】session用戶登錄狀態(tài)與斷開

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。

示意圖.png

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];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景在HTTP協(xié)議的定義中,采用了一種機(jī)制來記錄客戶端和服務(wù)器端交互的信息,這種機(jī)制被稱為cookie,cooki...
    時(shí)芥藍(lán)閱讀 2,480評(píng)論 1 17
  • 作者:晚晴幽草軒www.jeffjade.com/2016/10/31/115-summary-of-cookie...
    饑人谷_Dylan閱讀 1,268評(píng)論 0 51
  • 注:本文轉(zhuǎn)載自前端大全 背景 在HTTP協(xié)議的定義中,采用了一種機(jī)制來記錄客戶端和服務(wù)器端交互的信息,這種機(jī)制被稱...
    楠小忎閱讀 746評(píng)論 0 0
  • 1. cookie 1.1 什么是cookie cookie 是存儲(chǔ)于訪問者的計(jì)算機(jī)中的變量。每當(dāng)同一臺(tái)計(jì)算機(jī)通過...
    cbw100閱讀 4,203評(píng)論 0 13
  • 每過一段時(shí)間我都會(huì)重新去思考這兩個(gè)字:善良。 善良是個(gè)有界限的詞,但它沒有邊界,對(duì)于任何人都想用善良的心去對(duì)待。 ...
    小英的詩(shī)集閱讀 231評(píng)論 0 0

友情鏈接更多精彩內(nèi)容