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;
知识扩展:
NSHTTPCookiePropertyKey  是一个字符串类型。起始就是 NSString ,这里它使用了别名(alias)。有它定义了13个字符串常量。如下:


3》将Cookie转化为网络请求的头文件。

+ (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;

8》根据网址和存储地址设置Cookies
- (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的一些操作和使用。
1、手动处理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。
可以联系我,QQ:1542100658  或者 加入《成功QQ吧》QQ的群名。















 






0 0
原创粉丝点击