Cookie定义
百度百科是这么定义Cookie的,Cookie指某些网站为了辨别用户身份、进行 session跟踪而储存在用户本地终端上的数据。在前端开发识别用户身份的流程如下:
- 用户登录成功,获取token,保存token 到本地,同事保存一份token到NSHTTPCookieStorage中,下次在http请求的时候,默认httpRequest对象会默认带上NSHTTPCookieStorage中保存的cookie
- 用户在登录成功后,服务端会把cookie设置在NSHTTPURLResponse,客户端不需要重新设置cookie,只需要读取
NSHTTPURLResponse
中的cookie值然后保存在本地用户记录用户的登录状态
Cookie的作者
- 服务端
- 客户端(原生app,h5,pc)
Cookie的基本使用
Cookie相关类
- NSHTTPCookie:cookie基本类,有以下基本属性:
1. version:版本号
2. name:名称
3. value:值
4. expiresDate:超时时间,注意:一定要设置,不然很可能设置的cookie无效
5. domain:设置的域名
6. path:设置路径,一般根目录设置“/”
7. HTTPOnly:只能用做发送http请求,不能作用于其他用户,保证cookie不被其他的js获取,比如你的页面接入了第三方js,如果这个js是恶意的,可以获取cookie里面的信息,那么很可能拿到用户的私密信息,所以建议使用设置HTTPOnly为YES,一般服务器在设置cookie时,也应该设置HTTPOnly
8. secure:是否只能通过加密连接发送到受信任的服务器(即通过SSL或TLS),不应该被交付给任何服务器,防止跨站点脚本漏洞的javascript应用程序。
-
NSHTTPCookieStorage:保存cookie的单利
包含了cookie的基本操作,常用的方法有设置cookie
- (void)setCookie:(NSHTTPCookie *)cookie;
删除cookie
- (void)deleteCookie:(NSHTTPCookie *)cookie;
-
写入Cookie
NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setObject:@".tairanmall.com" forKey:NSHTTPCookieDomain]; [dict setObject:@"/" forKey:NSHTTPCookiePath]; [dict setObject:@"token" forKey:NSHTTPCookieName]; [dict setObject:@"123" forKey:NSHTTPCookieValue]; // 过期时间为1个月 [dict setValue:[NSDate dateWithTimeIntervalSinceNow:2592000] forKey:NSHTTPCookieExpires]; [dict setObject:@"0" forKey:NSHTTPCookieVersion]; NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:dict];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
```- Cookie的读取
NSHTTPCookieStorage *cookieStore = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (NSHTTPCookie *cookie in [cookieStore cookies]) { // 获取指定key的cookie if ([cookie.name isEqualToString:name]) { } }
在webView中设置cookie
-
UIWebView(早起的webview框架)
UIWebView设置Cookie与在http请求中添加的Cookie共用一套
NSHTTPCookieStorage
,所以保证设置一次即可 -
WKWebView
WKWebView相对于UIWebView,有以下优点
- 内存占用是UIWebView的1/4~1/3
- 页面加载速度有提升,有的文章说它的加载速度比UIWebView提升了一倍左右
- 更为细致地拆分了 UIWebViewDelegate 中的方法
- 自带进度条。不需要像UIWebView一样自己做假进度条(通过NJKWebViewProgress和双层代理技术实现),技术复杂度和代码量,根贴近实际加载进度优化好的多
- 允许JavaScript的Nitro库加载并使用(UIWebView中限制)
- 可以和js直接互调函数,不像UIWebView需要第三方库WebViewJavascriptBridge来协助处理和js的交互。
缺点
- Cookie管理很麻烦,不能支持缓存页面Cookie
- 同样是由于进程间通信性能问题,HTTPBody字段被丢弃
[request setHTTPMethod:@"POST"];[request setHTTPBody:[@"bodyData"dataUsingEncoding:NSUTF8StringEncoding]];[wkwebview loadRequest: request];
cookie设置注意项
- 必须设置过期时间:否则很容易会设置cookie后立马就会超时
- cookie自动丢失的问题:cookie存储在NSHTTPCookieStorage中,NSHTTPCookieStorage会持久化在本地,理论上只要app启动,就可以读取到设置过的cookie,但是偶发性的cookie被丢失,丢失原因不明,有相关资料显示cookie在客户端中五分钟又可能存在丢失的情况,这种情况比较偶发,
- cookie内存最大为4k,不要使用过长的cookie的值,设置过多的cookie