cookie和session以及iOS cookie的查取


Cookie的工作原理

http是無狀態的,這是什么意思呢?就是說,在沒有cookie之前,你第一次訪問這個頁面和第二次訪問這個頁面,

服務器是不知道的,不知道前一次是你。那么問題來了,我怎么登錄,登錄成功后,刷新下,服務器就不認識我了,

不展示我的信息了,這怎么能行,於是cookie就產生了,cookie是存在客戶端的,最常見的就是瀏覽器了,

你第一次訪問頁面的時候,服務器會返回個cookie給你,這個cookie其實就是sessionId,並存於客戶端,

第二次的時候,你刷新頁面的時候,瀏覽器就會帶上之前的cookie,cookie就像通行證,每人一個,

無論誰訪問都必須攜帶自己通行證。這樣服務器就能從通行證上確認客戶身份了,這就是Cookie的工作原理。

cookie可以設置有效期的,最常見的大家經常看到網站上的記住我功能,它就是利用cookie的有效期,

可以讓用戶一段時間內免登錄,cookie還可以存儲一些其它的信息,比如像早期有的購物網站,

用戶購物車這個東西,這個購物車因為用戶可能會一會添加一會刪除,如果存在數據庫里的話,

因為頻繁的操作,會對數據庫造成一定的壓力,畢竟用戶可能到最后啥也沒買,我的數據庫服務器卻收到了一萬點暴擊,

於是cookie的作用就來了,購物車信息存在cookie里,這樣服務器就沒有來自購物車的壓力了,

平攤到了千千萬萬的用戶瀏覽器上了,是不是很絕妙。

session是干嘛的

既然cookie可以存數據,那么直接存用戶的信息不好嗎?干嘛還要session。這就涉及到網絡安全的問題了,

cookie存在客戶端,假如把你的銀行卡信息存在cookie里,這時你去上個廁所,其他同事去翻了你的cookie,

不是被盜了嗎,是不是很危險。於是就有了session。

session才是存用戶的一些隱私信息的,session是存在服務器端的,非法用戶一般是無法盜取的,很安全。

一般登錄用戶請求頁面的時候,瀏覽器會帶上服務器頒發的憑證cookie,憑着這個憑證,

找到服務器里存着對應的session數據,一判斷session里有用戶信息,於是根據用戶信息返回相關數據。

登錄功能就是這樣實現的。

如果一個網站有千萬的用戶,千萬的用戶同時在線,那么服務器就要維護千萬份的session,壓力山大,

所以可以考慮把session持久化到redis或者memcached中,減輕web服務器的壓力,提高web的響應速度。

iOS cookie的查取

當你訪問一個網站時,NSURLRequest都會幫你主動記錄下來你訪問的站點設置的Cookie,如果 Cookie 存在的話,

會把這些信息放在 NSHTTPCookieStorage 容器中共享,當你下次再訪問這個站點時,NSURLRequest會拿着上次保存下來了的Cookie繼續去請求。
同樣適用於ASIHTTPRequest,AFNetworking, Webview等,Cookie常用於一些基於認證的網絡請求

NSHTTPCookieStorage

NSHTTPCookieStorage 實現了一個管理cookie的單例對象(只有一個實例),每個Cookie都是NSHTTPCookie類的實例,

另外Cookie在所有應用之間共享並在不同進程之間保持同步。Session Cookie(一個isSessionOnly方法返回YES的Cookie)只能在單一進程中使用。

cookie

Cookie是由服務器端生成,發送給User-Agent(一般是瀏覽器或者客戶端),瀏覽器會將Cookie的key/value保存到某個目錄下的文本文件內,

下次請求同一網站地址時就發送該Cookie給服務器

HTTP header

HTTP header中包含HTTP請求與響應的操作參數. header屬性定義了所傳輸數據的各種特性. header屬性以屬性名開始,

以冒號結尾,最后是屬性值.屬性名及值會因應用的不同

查看cookie

在請求網絡后執行下面代碼,就可以看到cookie了。

    NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    NSArray *cookieArr = [cookieJar cookies];
    for(NSHTTPCookie *cookie in cookieArr) {
        NSLog(@"cookie -> %@", cookie);
        if ([cookie.name isEqualToString:@"_xxx_session"]) {
           
        }
    }

 

舉例如下:

<__NSArrayM 0x280347a20>(

<NSHTTPCookie

version:0

name:_xxx_session

value:dENxcHNNY21TV2hCQzR6Q0hCTDE0bjlvaVQ4bFFGK3Zqak5JcDFUQUFCU3N0ZW42ejRNcnVMTFF2WHc5K1RyQVRWNENXdmxIV1RyMkhNV0ZzRFo4OHQwUDNXZTU5c1pRNWNxNjBDZEZOWjk5MUFaY2JvNTVVeUlkM3VUSHVvUURXWG9ZbE81STNQSjV5UzBFN1Z6L3V0K0VYYU5FMFJMRlVLT3BpbTdIZ2xJPS0tMW12S05naDF2NGdzWHVFL3Z0dXNUQT09--4b532f9179c51677ec5d2772077e268752373ce5

expiresDate:'(null)'

created:'2019-06-19 06:23:01 +0000'

sessionOnly:TRUE

domain:xxx.xxx.com

partition:none

sameSite:none

path:/

isSecure:FALSE

isHTTPOnly: YES

 path:"/" isSecure:FALSE isHTTPOnly: YES>

)

NSHTTPCookieStorage實現cookie管理

網絡框架AFNetworking  沒有對Cookie 做過處理。

 可以使用NSHTTPCookieStorage實現cookie管理

1.存cookie

【NSHTTPCookieStorage sharedHTTPCookieStorage 】cookiesforURL:

2.設置cookie

【NSHTTPCookieStorage sharedHTTPCookieStorage 】setCookie:

3.清理

【NSHTTPCookieStorage sharedHTTPCookieStorage 】 deleteCookie:

token算是session的另一種說明吧

http:短連接使用token 機制來驗證用戶安全性

 token 值: 登錄令牌! 用來判斷當前用戶的登錄狀態!

 token 值特點: 是一個字符串/大整數,只需要保證唯一性.是服務器根據用戶的信息(賬號/密碼/身份認證機制(電話號/身份證號/支付寶賬號/銀行卡信息)...)來生成的用於標識用戶身份的值! 上面的

value:dENxcHNNY21TV2hCQzR6Q0hCTDE0bjlvaVQ4bFFGK3Zqak5JcDFUQUFCU3N0ZW42ejRNcnVMTFF2WHc5K1RyQVRWNENXdmxIV1RyMkhNV0ZzRFo4OHQwUDNXZTU5c1pRNWNxNjBDZEZOWjk5MUFaY2JvNTVVeUlkM3VUSHVvUURXWG9ZbE81STNQSjV5UzBFN1Z6L3V0K0VYYU5FMFJMRlVLT3BpbTdIZ2xJPS0tMW12S05naDF2NGdzWHVFL3Z0dXNUQT09--4b532f9179c51677ec5d2772077e268752373ce5

 就是嘍。

token 值獲取:

// 當用戶首次登錄成功之后, 服務器端就會生成一個 token 值.

1.會在服務器保存token值(保存在數據庫中)

2.將這個token值返回給客戶端.

// 客戶端拿到 token 值之后,一般保存在兩個位置 :

1. 將 token 保存在 cookie 中;

2.將 token 保存在沙盒中,作為一個公共參數傳遞.

公共參數: 每一個網絡請求都需要的參數! 一般公共參數有很多都是"可選"參數!,公共參數附帶的越多,越利於后台監測用戶,數據挖掘會使用到監測到的數據.

以后客戶端再次發送網絡請求(一般不是登錄請求)的時候,就會將這個 token 值附帶到參數中發送給服務器.

服務器接收到客戶端的請求之后,會取出token值與保存在本地(數據庫)中的token值做對比!

如果兩個 token 值相同 :說明用戶登錄成功過!當前用戶處於登錄狀態!

如果沒有這個 token 值, 沒有登錄成功.

如果 token 值不同: 說明原來的登錄信息已經失效,讓用戶重新登錄.

補充:怎么將 token 保存在 cookie 中,當APP進入后台,把token保存一下,當進入前台再進行存入在 cookie 中。

 相關鏈接:https://www.cnblogs.com/W-Kr/p/5478702.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM