Cookie是什麼?從哪來?存在哪?往哪去?
什麼是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從哪來,存在哪,往哪去。
相關文章
- cookie從哪來到哪去Cookie
- 什麼是cookie,什麼是sessionCookieSession
- Cookie 是什麼?從儲存登入到廣告追蹤的那些事Cookie
- 增長點在哪、最花錢是什麼遊戲、出海該往哪走?一文看懂全球遊戲大盤!遊戲
- 什麼是Cookie、令牌與JWT?CookieJWT
- 什麼是YottaChain儲存,為什麼說是未來資料儲存的趨勢?AI
- cookie是什麼?和session有什麼區別?CookieSession
- 什麼是 cookie 的 httponly 屬性CookieHTTP
- 什麼是庫存?什麼是零庫存?庫存的定義
- Session是什麼?它與Cookie有什麼區別?SessionCookie
- 什麼是雲原生?為什麼是Portworx來解決雲原生儲存問題?
- 資料庫mysql儲存是什麼?可以存什麼?資料庫MySql
- 什麼是物件儲存?物件
- IDC銷售是什麼?難在哪裡?
- SRAM是什麼儲存器
- 什麼是eval()?eval是用來幹什麼的?
- 什麼是HDFS 分散式儲存分散式
- 復刻包是什麼意思復刻包包貨源哪裡來
- git 中 rebase 是什麼樣的操作,應該從哪個分支rebase到哪個分支Git
- GNU是什麼?與Linux的不同之處在哪?Linux
- AI儲存的需求是什麼?未來趨勢是怎樣的?AI
- 銀行的數字化轉型從哪裡來?究竟是什麼?到哪裡去?
- 什麼是存算分離架構?架構
- 不同國家的退休生活,哪種是你嚮往的?
- 共享儲存是什麼意思?與DRBD有什麼區別?
- steam雲存檔在哪裡怎麼找 steam雲存檔在電腦哪個資料夾
- 什麼叫好茶葉?從哪裡買茶葉好?從哪裡買茶葉好? 買什麼茶葉好喝?
- 人來人往的五年,微軟智慧雲Azure憑什麼活著?微軟
- Kali Linux是什麼?可以用來做什麼?Linux
- DFMEA是用來幹什麼的?
- Java是用來幹什麼的?Java
- Roguelike+割草為什麼這麼火?《吸血鬼倖存者》成功在哪裡?
- win10主題在哪個資料夾_win10主題儲存的路徑是什麼Win10
- session 和 cookie 有什麼區別?SessionCookie
- cookie和session 有什麼區別?CookieSession
- 在Linux中,什麼是SAN和NAS儲存?Linux
- 【Java面試】什麼是可重入,什麼是可重入鎖? 它用來解決什麼問題?Java面試
- 什麼是負載均衡?有哪幾種策略?負載
- DevOps是什麼?DevOps能夠給我們帶來什麼?dev