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
- 什麼是 CookieCookie
- 增長點在哪、最花錢是什麼遊戲、出海該往哪走?一文看懂全球遊戲大盤!遊戲
- 傳統運維 VS 網際網路運維:從哪來,到哪去?運維
- 什麼是YottaChain儲存,為什麼說是未來資料儲存的趨勢?AI
- 什麼是Cookie、令牌與JWT?CookieJWT
- 什麼是庫存?什麼是零庫存?庫存的定義
- 什麼是 cookie 的 httponly 屬性CookieHTTP
- Session是什麼?它與Cookie有什麼區別?SessionCookie
- 什麼是雲原生?為什麼是Portworx來解決雲原生儲存問題?
- 資料庫mysql儲存是什麼?可以存什麼?資料庫MySql
- 什麼是物件儲存?物件
- SRAM是什麼儲存器
- 什麼是儲存過程儲存過程
- 為什麼不能往Android的Application物件裡儲存資料AndroidAPP物件
- 什麼是HDFS 分散式儲存分散式
- HBase的儲存格式是什麼?
- 你的隱私安全嗎:Cookie到底是什麼?Cookie
- [來往]使用uiautomator自動新增來往好友UI
- 人來人往的五年,微軟智慧雲Azure憑什麼活著?微軟
- steam雲存檔在哪裡怎麼找 steam雲存檔在電腦哪個資料夾
- AI儲存的需求是什麼?未來趨勢是怎樣的?AI
- http狀態碼是什麼,有什麼用,在哪裡檢視,分別代表什麼意思?HTTP
- GNU是什麼?與Linux的不同之處在哪?Linux
- 什麼是存算分離架構?架構
- 儲存------什麼是MAID(轉帖)AI
- 什麼是NAS網路附加儲存
- 共享儲存是什麼意思?與DRBD有什麼區別?
- 什麼是負載均衡?有哪幾種策略?負載
- Java是用來幹什麼的?Java
- 計算的未來是什麼?
- Kali Linux是什麼?可以用來做什麼?Linux
- 前端頁面有哪三層構成,分別是什麼?作用是什麼?前端
- 加密演算法是什麼?有哪幾種型別?有什麼用?加密演算法型別
- 【Java面試】什麼是可重入,什麼是可重入鎖? 它用來解決什麼問題?Java面試
- 會話與 Cookie:使用者登入的原理是什麼?會話Cookie
- JavaScript,你從哪裡來?(上)JavaScript