IOS的Cookie之网页身份认证与Session的追踪
来源:互联网 发布:淘宝网看手机 编辑:程序博客网 时间:2024/05/20 14:27
1、Cookie 是什么?
答:指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据。从定义上得出,Cookie实际上是指小量信息,是由 Web 服务器创建的,将信息存储在用户计算机上的文件。
2、Cookie 有什么作用?
答:从第一问的回答中,我们就可以知道Cookie的作用。Cookie 的作用是:为了辨别用户身份、进行Session 跟踪。
3、Cookie的限制?
答:一个网页能创建的Cookie 数量最多为 300 个,并且每个不能超过 4KB,每个 Web 站点能设置的 Cookie 总数不能超过 20 个。
4、Cookie的原理
答:Cookie”是小量信息,由服务器发送出来以存储在网络浏览器上,从而下次这位独一无二的访客又回到该网络服务器时,可从该浏览器读回此信息。
5、Cookie 的生命有多长?
答:Cookie在生成时就会被指定一个Expire值,这就是Cookie的生存周期,在这个周期内Cookie有效,超出周期Cookie就会被清除。有些页面将Cookie的生存周期设置为“0”或负值,这样在关闭浏览器时,就马上清除Cookie,不会记录用户信息,更加安全。注意:对于IOS客户端Cookie的生命周期是:IOS的Cookie是在网页产生而产生,并缓存到内存中。当App关闭时,App产生的内存就会被释放。所以Cookie 就也被清楚。
第二:与Cookie相关的类。
NSHTTPCookieStorage 和 NSHTTPCookie 。这两个类的作用分别是:NSHTTPCookieStorage 是网页产生的cookie的管理器,它控制Cookie的一些基本操作。NSHTTPCookie是Cookie的使用对象,通过这个对象我们可以获取与Cookie相关的信息。
第三:NSHTTPCookieStorage 与 NSHTTPCookie 两个类的介绍。
1、NSHTTPCookie 介绍。
1》NSHTTPCookie 继承与NSObject ,拥有一个NSHTTPCookieInternal类型的私有变量_cookiePrivate。NSHTTPCookieInternal 这个类在静态库中查找不到,网上收索没有使用记录。
2》Cookie的创建有两个方法,如下:
1)实例方法:- (nullable instancetype)initWithProperties:(NSDictionary<NSHTTPCookiePropertyKey, id> *)properties;
2)类方法:+ (nullable NSHTTPCookie *)cookieWithProperties:(NSDictionary<NSHTTPCookiePropertyKey, id> *)properties;
知识扩展:+ (NSDictionary<NSString *, NSString *> *)requestHeaderFieldsWithCookies:(NSArray<NSHTTPCookie *> *)cookies;
4》指定的响应头字段和URL解析的cookie数组+ (NSArray<NSHTTPCookie *> *)cookiesWithResponseHeaderFields:(NSDictionary<NSString *, NSString *> *)headerFields forURL:(NSURL *)URL;
5》NSHTTPCookie 的一些只读参数2、NSHTTPCookieStorage 的介绍。
1》NSHTTPCookieStorage 是一个继承与NSOBject的单利对象,它管理者共存的Cookie。 它有方法 允许客户端设置和删除cookie,并获取当前Cookie。 它还有方便的方法来解析和生成Cookie相关的HTTP头字段。
2》获取相同标记的Cookie管理单利。
+ (NSHTTPCookieStorage *)sharedCookieStorageForGroupContainerIdentifier:(NSString *)identifier
3》获取所有的Cookies。@property (nullable , readonly, copy) NSArray<NSHTTPCookie *> *cookies;
4》设置Cookie,并交于NSHTTPCookieStroage 管理。
- (void)setCookie:(NSHTTPCookie *)cookie;
5》从管理器中删除Cookie.- (void)deleteCookie:(NSHTTPCookie *)cookie;
6》删除指定日期前的Cookies.- (void)removeCookiesSinceDate:(NSDate *)date NS_AVAILABLE(10_10, 8_0);
7》获取指定URL的Cookies。- (nullable NSArray<NSHTTPCookie *> *)cookiesForURL:(NSURL *)URL;
- (void)setCookies:(NSArray<NSHTTPCookie *> *)cookies forURL:(nullable NSURL *)URL mainDocumentURL:(nullable NSURL *)mainDocumentURL;9》获取Cookie对接受者的设置。
@property NSHTTPCookieAcceptPolicy cookieAcceptPolicy;10》获取指定顺序的Cookies。
- (NSArray<NSHTTPCookie *> *)sortedCookiesUsingDescriptors:(NSArray<NSSortDescriptor *> *) sortOrder NS_AVAILABLE(10_7, 5_0);11》对网络Cookie的设置和获取。
- (void)storeCookies:(NSArray<NSHTTPCookie *> *)cookies forTask:(NSURLSessionTask *)task NS_AVAILABLE(10_10, 8_0);- (void)getCookiesForTask:(NSURLSessionTask *)task completionHandler:(void (^) (NSArray<NSHTTPCookie *> * _Nullable cookies))completionHandler NS_AVAILABLE(10_10, 8_0);12》Cookie变化的通知
FOUNDATION_EXPORT NSNotificationName const NSHTTPCookieManagerAcceptPolicyChangedNotification;FOUNDATION_EXPORT NSNotificationName const NSHTTPCookieManagerCookiesChangedNotification;
第四、Cookie的一些操作和使用。#pragma mark -- 手动创建Cookie-(void)createHandCookie{ //** 配置参数 NSDictionary * properties = @{ NSHTTPCookieComment:@"登录Cookie",// cookie的描述 NSHTTPCookieCommentURL:@"https://blog.csdn.net/zhoushuangjian511",// Cookie的描述网址 NSHTTPCookieDomain:@".baidu.com",// Cookie对应的域名 NSHTTPCookieDiscard:@"TRUE",// 是否会话完毕就清楚Cookie NSHTTPCookieExpires:@"3600", NSHTTPCookieName:@"login", NSHTTPCookiePath:@"/",//Cookie的存储路径 NSHTTPCookieVersion:@"0",// 版本 NSHTTPCookieSecure:@"TRUE",// Cookie安全 NSHTTPCookieValue:@"Cookie"//Cookie的值 }; NSHTTPCookie * LoginCookie = [NSHTTPCookie cookieWithProperties:properties]; //** NSHTTPCookieStorage 进行管理 [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:LoginCookie]; //** 我们从NSHTTPCookieStorage中获取cookie NSLog(@"%@",[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]); //** 输出 /*! "<NSHTTPCookie version:0 name:\"login\" value:\"Cookie\" expiresDate:(null) created:2017-01-11 05:20:02 +0000 sessionOnly:TRUE domain:\".baidu.com\" partition:\"none\" path:\"/\" isSecure:TRUE comment:\"\U767b\U5f55Cookie\" commentURL:\"https://blog.csdn.net/zhoushuangjian511\">" ) */}2、在普通请求中获取Cookie.
#pragma mark --获取网络生成的Cookie-(void)getOrdinaryCookie{ NSURL * url = [NSURL URLWithString:@"https://www.baidu.com"]; //** 创建请求对象 NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url]; //** 配置request的请求头 request.HTTPMethod = @"GET"; //** 设置请求超时时间 10s request.timeoutInterval = 10.0; //** 获取网络配置 NSURLSessionConfiguration * configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; //** 构建网络会话 NSURLSession * session = [NSURLSession sessionWithConfiguration:configuration]; //** 构造会话的任务 NSURLSessionTask * task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { //** 对请求的结果处理 if (error) { //** 请求失败 }else{ //** data 就是我们请求的结果,自己根据需求处理。 //** 我们现在是获取网络的Cookie NSHTTPCookieStorage * storage =[NSHTTPCookieStorage sharedHTTPCookieStorage]; for (NSHTTPCookie * cookie in storage.cookies) { NSLog(@"%@",cookie); } //** 输出 /*! 2017-01-11 14:33:13.944 ios_cookie[3737:1151519] <NSHTTPCookie version:0 name:"__bsi" value:"12473150068259932201_00_14_N_N_2_0303_C02F_N_N_Y_0" expiresDate:2017-01-11 06:33:19 +0000 created:2017-01-11 06:33:13 +0000 sessionOnly:FALSE domain:".www.baidu.com" partition:"none" path:"/" isSecure:FALSE> 2017-01-11 14:33:13.944 ios_cookie[3737:1151519] <NSHTTPCookie version:0 name:"BD_NOT_HTTPS" value:"1" expiresDate:2017-01-11 06:38:13 +0000 created:2017-01-11 06:33:13 +0000 sessionOnly:FALSE domain:"www.baidu.com" partition:"none" path:"/" isSecure:FALSE> 2017-01-11 14:33:13.944 ios_cookie[3737:1151519] <NSHTTPCookie version:0 name:"BIDUPSID" value:"6A2A9B9405252A9331798806B1DB80A7" expiresDate:2085-01-29 09:45:42 +0000 created:2017-01-11 06:31:35 +0000 sessionOnly:FALSE domain:".baidu.com" partition:"none" path:"/" isSecure:FALSE> 2017-01-11 14:33:13.944 ios_cookie[3737:1151519] <NSHTTPCookie version:0 name:"PSTM" value:"1484116296" expiresDate:2085-01-29 09:45:42 +0000 created:2017-01-11 06:31:35 +0000 sessionOnly:FALSE domain:".baidu.com" partition:"none" path:"/" isSecure:FALSE> \***************************我们自定义的那个Cookie*************************\ 2017-01-11 14:33:13.956 ios_cookie[3737:1151519] <NSHTTPCookie version:0 name:"login" value:"Cookie" expiresDate:(null) created:2017-01-11 06:33:13 +0000 sessionOnly:TRUE domain:".baidu.com" partition:"none" path:"/" isSecure:TRUE comment:"登录Cookie" commentURL:"https://blog.csdn.net/zhoushuangjian511"> */ } }]; //** 网络任务的执行 [task resume]; }3、删除Cookie.
#pragma mark -- 删除Cookie-(void)deleteCookie{ NSHTTPCookieStorage * storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (NSHTTPCookie * cookie in storage.cookies) { [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie]; } //** 我们输出Cookie NSLog(@"gg:%@",storage.cookies); //** 输出 /*! 2017-01-11 15:06:44.940 ios_cookie[4036:1215925] gg:( ) */}4、获取Cookie的详细信息。
//** 获取某个Cookie的详细信息-(void)detailCookie{ NSHTTPCookieStorage * storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (NSHTTPCookie * cookie in storage.cookies) { NSLog(@"%@",cookie.properties); } //** 输出 /*! 2017-01-11 15:14:52.692 ios_cookie[4134:1239619] { Created = 505811514; Domain = "www.baidu.com"; Expires = "2017-01-11 07:16:54 +0000"; Name = "BD_NOT_HTTPS"; Path = "/"; Value = 1; } */}5、将获取的Cookie本地化
#pragma mark 本地存储Cookie-(void)saveCookie{ NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; NSMutableDictionary * mutableDictionary = [NSMutableDictionary dictionaryWithCapacity:0]; NSHTTPCookieStorage * storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (NSHTTPCookie * cookie in storage.cookies) { [mutableDictionary setObject:cookie.properties forKey:cookie.name]; } [defaults setObject:mutableDictionary forKey:@"Cookie"]; [defaults synchronize];}6、再将存储在本地的Cookie取出在使用。
#pragma mark -- 获取本地的Cookie,在使用-(void)getLocationCookie{ NSDictionary * dictCookie = [[NSUserDefaults standardUserDefaults] objectForKey:@"Cookie"]; for (NSDictionary * temp in dictCookie.allValues) { NSHTTPCookie * cookie = [NSHTTPCookie cookieWithProperties:temp]; //** 将Cookie,进行管理 [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie]; } //** 在输出Cookie NSHTTPCookieStorage * storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; NSLog(@"我是再使用的cookie:%@",storage.cookies);}输出:2017-01-11 15:40:08.081 ios_cookie[4401:1336210] 我是存储前的Cookie:( "<NSHTTPCookie version:0 name:\"__bsi\" value:\"10527452702358934328_00_13_N_N_3_0303_C02F_N_N_Y_0\" expiresDate:2017-01-11 07:40:13 +0000 created:2017-01-11 07:40:08 +0000 sessionOnly:FALSE domain:\".www.baidu.com\" partition:\"none\" path:\"/\" isSecure:FALSE>", "<NSHTTPCookie version:0 name:\"BIDUPSID\" value:\"CF5A81284093C8A1BF19B99B5FB8E985\" expiresDate:2085-01-29 10:20:52 +0000 created:2001-01-01 00:00:01 +0000 sessionOnly:FALSE domain:\".baidu.com\" partition:\"none\" path:\"/\" isSecure:FALSE>", "<NSHTTPCookie version:0 name:\"PSTM\" value:\"1484118405\" expiresDate:2085-01-29 10:20:52 +0000 created:2001-01-01 00:00:01 +0000 sessionOnly:FALSE domain:\".baidu.com\" partition:\"none\" path:\"/\" isSecure:FALSE>", "<NSHTTPCookie version:0 name:\"login\" value:\"Cookie\" expiresDate:(null) created:2017-01-11 07:40:07 +0000 sessionOnly:TRUE domain:\".baidu.com\" partition:\"none\" path:\"/\" isSecure:TRUE comment:\"\U767b\U5f55Cookie\" commentURL:\"https://blog.csdn.net/zhoushuangjian511\">", "<NSHTTPCookie version:0 name:\"BD_NOT_HTTPS\" value:\"1\" expiresDate:2017-01-11 07:45:08 +0000 created:2017-01-11 07:40:08 +0000 sessionOnly:FALSE domain:\"www.baidu.com\" partition:\"none\" path:\"/\" isSecure:FALSE>")2017-01-11 15:40:08.089 ios_cookie[4401:1336210] 我是再使用的cookie:( "<NSHTTPCookie version:0 name:\"__bsi\" value:\"10527452702358934328_00_13_N_N_3_0303_C02F_N_N_Y_0\" expiresDate:2017-01-11 07:40:13 +0000 created:2001-01-01 00:00:01 +0000 sessionOnly:FALSE domain:\".www.baidu.com\" partition:\"none\" path:\"/\" isSecure:FALSE>", "<NSHTTPCookie version:0 name:\"BIDUPSID\" value:\"CF5A81284093C8A1BF19B99B5FB8E985\" expiresDate:2085-01-29 10:20:52 +0000 created:2001-01-01 00:00:01 +0000 sessionOnly:FALSE domain:\".baidu.com\" partition:\"none\" path:\"/\" isSecure:FALSE>", "<NSHTTPCookie version:0 name:\"PSTM\" value:\"1484118405\" expiresDate:2085-01-29 10:20:52 +0000 created:2001-01-01 00:00:01 +0000 sessionOnly:FALSE domain:\".baidu.com\" partition:\"none\" path:\"/\" isSecure:FALSE>", "<NSHTTPCookie version:0 name:\"login\" value:\"Cookie\" expiresDate:(null) created:2001-01-01 00:00:01 +0000 sessionOnly:TRUE domain:\".baidu.com\" partition:\"none\" path:\"/\" isSecure:TRUE comment:\"\U767b\U5f55Cookie\" commentURL:\"https://blog.csdn.net/zhoushuangjian511\">", "<NSHTTPCookie version:0 name:\"BD_NOT_HTTPS\" value:\"1\" expiresDate:2017-01-11 07:45:08 +0000 created:2001-01-01 00:00:01 +0000 sessionOnly:FALSE domain:\"www.baidu.com\" partition:\"none\" path:\"/\" isSecure:FALSE>")
第五、博客的Demo。
- IOS的Cookie之网页身份认证与Session的追踪
- session,cookie 的身份认证那些事儿
- http相关的session及cookie的工作原理与身份认证
- 身份认证与session对象
- iOS的cookie认证登陆
- Shiro 的身份认证
- cookie与session学习之六--cookie的一些应用
- 会话追踪中的Cookie和Session机制的区别
- session与cookie的区别
- session与cookie的区别
- Session与Cookie的区别
- session与cookie的区别
- cookie与Session的区别
- session与cookie的区别
- session与cookie的区别
- cookie 与 session 的区别
- Session与Cookie的区别
- session与cookie的区别
- Spring3系列: Spring AOP——Pointcut,Advisor
- 实现一个选择排序程序,排序整型数组
- JavaScript 面向对象介绍
- select重置
- vs2013编译win-32位下的libevent-2.0.21-stable,debug版本
- IOS的Cookie之网页身份认证与Session的追踪
- 微信小程序实例:move事件导致navigator组件和tap事件无效
- poj Children of the Candy Corn(BFS+DFS)
- apache 配置 httpd-vhost.conf 。VirtualHost 配置更改域名,端口 。 无法访问 localhost
- MyBatis动态传入表名,字段名参数的解决办法
- JAVA 枚举类型 根据代码得到中文
- PAT乙级1027
- UIWebView保存图片
- Spring面试,IoC和AOP的理解