Cookie是什麼?從哪來?存在哪?往哪去?

weixin_34402408發表於2017-06-29

什麼是cookie?

cookie最簡單的介紹就是伺服器返回的一個字串資訊,只不過我們每次請求都需要把它傳送給伺服器。以AFN和android-async-http為例子,預設都會把cookie自動儲存並且下次傳送請求的時候將cookie提交給伺服器。

什麼時候會提交cookie到伺服器?

這個問題需要知道cookie的作用域,cookie有效的作用域為當前檔案目錄以及子目錄。例如:

http://www.xxx.com/love  
//如果此請求返回了cookie,並且path是/love

那麼在程式的生命期間,通過AFN和android-async-http訪問所有的/love目錄以及/love/xxx的子目錄的時候,框架會自動將cookie提交到伺服器。
如果發起的請求不是/love目錄本身或者其子目錄,那麼框架就不會將cookie提交到伺服器。如果這個時候需要我們訪問http://www.xxx.com/person介面的時候也帶上之前返回的cookie,該怎麼辦?

返回的cookie存在哪裡?

最簡單的辦法就是自己做cookie的儲存和傳送,伺服器返回的cookie會儲存在response 的Header裡面,例如:

HTTP response Header:
{
    "Content-Type" = "text/html;charset=UTF-8";
    Date = "Thu, 29 Jun 2017 08:50:18 GMT";
    Server = "Apache-Coyote/1.1";
    "Set-Cookie" = "token=a27c5779-3718-4716-bbfa-6a51407c6d70";
    "Transfer-Encoding" = Identity;
}

其中"Set-Cookie"是response的Header中預設用來儲存cookie的欄位(當然你可以另外起其它名字,但是通用的規範還是這個字串)

提交給伺服器的cookie存在哪裡?

和response的Header一樣,request的Header中也有一個欄位用來儲存cookie字串,這個欄位預設是cookie,例如:

HTTP request Header:
{
    Cookie = token=c66fbbc7-d799-426e-b065-d23226833dda;
    Content-Type = application/x-www-form-urlencoded; charset=utf-8;
    Device-OS = 10.3;
    version = 1.0.57;
    User-Agent = XProduct/1.0.57 (iPhone; iOS 10.3; Scale/2.00);
    Device-Name = x86_64;
    Accept-Language = zh-Hans-US;q=1, en;q=0.9;
}

具體怎麼做?

現在知道了cookie是什麼,從哪來,往哪去,那麼事情就簡單了,所以問題的最後變成了:如何獲取response Header中的鍵值對以及如何設定request Header?
當然,不管是iOS還是Android都有提供相應的HTTPCookie框架,其次其本質無非就是從response Header中的"Set-Cookie"獲取字串,然後將指定的cookie儲存在requset的Header中,例如:

//獲取cookie
NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
//fields的輸出結果就是上面的response header的內容
NSDictionary *fields = [res allHeaderFields];
NSLog(@"fields = %@", [fields description]);
NSArray<NSHTTPCookie *> *cookie = [NSHTTPCookie cookiesWithResponseHeaderFields:fields forURL:request.URL] 

上面NSHTTPCookie的類方法其實就是將上面的respnse Header中的cookie字串拆分成為一物件,比如下面就是拆分結果:

<NSHTTPCookie version:0 name:"token" value:"a27c5779-3718-4716-bbfa-6a51407c6d70"
 expiresDate:(null) created:2017-06-29 08:50:21 +0000 sessionOnly:TRUE domain:"102.211.179.114" 
partition:"none" path:"/XProduct" isSecure:FALSE>

我們完全可以不需要使用NSHTTPCookie,無非就是從response Header中獲得Set-Cookie欄位對應的字串罷了。

至於將cookie設定到request Header中的框架API,我就沒有去細看,因為我直接手動設定:

httpRequestSerializer = [AFHTTPRequestSerializer serializer];
//token是一個字串,是response header中'Set-Cookie'對應的字串
[httpRequestSerializer setValue:token forHTTPHeaderField:@"cookie"]

至於怎麼使用API去做cookie,這個搜尋一下還是挺多介紹的,本文主要介紹的是cookie從哪來,存在哪,往哪去。

相關文章