iOS平台下cookie的使用

来源:互联网 发布:消防大数据平台 编辑:程序博客网 时间:2024/06/06 03:47

cookie我们在iOS中可以自己管理,也可以直接NSHTTPCookieStorage管理

根据Cookies的三个基本用途,可以把它们分成三类。第一类是跟踪个人用户在特定网站上的交易,以便用户可以开始和终止交易并返回到它正在从事的工作中。Cookies的这种用途是与仅在临时内存中放置而不写入用户硬盘驱动器的Cookies相一致。交易结束后,这种Cookies可以在完成它的任务后消失。这种Cookies可以帮助顾客得到更好的在线服务,并且为交易提供方便。Cookies的第二种用途或第二种Cookies是由网站放置在用户的硬盘驱动器上,以便用户再次反问该网站时,该网站可以识别这个用户。第三类Cookies就是所谓的“第三方Cookies”,它们不是由用户使用的网站放置在用户的硬盘驱动器上的,而是诸如DoubleClick通过使用它的横幅广告,记录用户的浏览历史。而通过这些横幅广告,DoubleClick公司可以出现在11500家广告商放置广告的所有网站上.

首先,先介绍下iOS对cookie的操作的两个类:

帖子来源于:http://blog.csdn.net/chun799/article/details/17206907

1. NSHTTPCookie  2. NSHTTPCookieStorage

NSHTTPCookie对象代表一个HTTP cookie。 这是一个不可改变的对象,从一个包含cookie的属性的字典初始化,这个类可以用来手动创建cookie的Properties 。

- (NSUInteger)version; 

- (NSString *)name;

- (NSString *)value;

- (NSString *)domain;

- (NSString *)path;

- (BOOL)isSessionOnly;等等属性,具体属性请自行谷歌

可以通过手工赋值的方式创建Cookie,如

+ (id)cookieWithProperties:(NSDictionary *)properties;

- (id)initWithProperties:(NSDictionary *)properties;

也可以从Cookie中读取到所有属性。

- (NSDictionary *)properties;

使用NSHTTPCookie的类方法可以将NSHTTPCookie实例与HTTP cookie header相互转换.

根据NSHTTPCookie实例数组生成对应的HTTP cookie header

+ (NSDictionary *)requestHeaderFieldsWithCookies:(NSArray *)cookies;

从headerFileds中读取到Cookie相关内容,生成NSHTTPCookie实例对象数组。

+ (NSArray *)cookiesWithResponseHeaderFields:(NSDictionary *)headerFields forURL:(NSURL *)theURL;

该方法会忽略headerFileds中与cookie无关的字段,如果headerFileds中的cookie没有指定domain,则使用theURL的domain,如果没有指定path,则使用”/”.

除非NSURLRequest明确指定不使用cookie(HTTPShouldHandleCookies设为NO),否则URL loading system会自动为NSURLRequest发送合适的存储cookie。从NSURLResponse返回的cookie也会根据当前的cookie访问策略(cookie acceptance policy)接收到系统中。

例如:

NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];  // 创建cookie属性字典

[cookieProperties setObject:@"username" forKey:NSHTTPCookieName]; // 手动设置cookie的属性

[cookieProperties setObject:@"rainbird" forKey:NSHTTPCookieValue];

[cookieProperties setObject:@"cnrainbird.com" forKey:NSHTTPCookieDomain];

[cookieProperties setObject:@"cnrainbird.com" forKey:NSHTTPCookieOriginURL];

[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];

[cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];

NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];  // 通过NSHTTPCookie的cookieWithProperties方法,将属性字典传入进行初始化,对象返回的是一个NSHTTPCookie对象,创建完成后进行下一步操作:

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];  // 将手动创建返回的NSHTTPCookie对象添加到NSHTTPCookieStorage中,在iOS中使用NSHTTPCookie类封装一条cookie,通过NSHTTPCookie的方法读取到cookie的通用属性。在此声明一点:如果你的request里面明确不使用cookie,那么要讲cookie的(HTTPShouldHandleCookies设为NO),否则URL loading system会自动为NSURLRequest发送合适的存储cookie。

下面来介绍一下NSHTTPCookieStorage对象:

NSHTTPCookieStorage提供了管理所有NSHTTPCookie 对象的接口在OS X里,cookie是在所有程序中共享的,而在iOS中,cookie只当当前应用中有效。

通过sharedHTTPCookieStorage方法可获取到共享的NSHTTPCookieStorage单件对象。

+ (NSHTTPCookieStorage *)sharedHTTPCookieStorage;

使用NSHTTPCookieStorage单件对象可获取到当前存储的所有cookie

- (NSArray *)cookies

或针对特定URL的cookie

- (NSArray *)cookiesForURL:(NSURL *)theURL;

还可以添加/删除Cookie

– deleteCookie:

– setCookie:

– setCookies:forURL:mainDocumentURL:

通过NSHTTPCookieStorage可读取/修改cookie接收策略,默认为NSHTTPCookieAcceptPolicyAlways.

- (NSHTTPCookieAcceptPolicy)cookieAcceptPolicy;

- (void)setCookieAcceptPolicy:(NSHTTPCookieAcceptPolicy)aPolicy.

一共有三种cookie accept policy。typedef enum {

NSHTTPCookieAcceptPolicyAlways,

NSHTTPCookieAcceptPolicyNever,

NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain

}NSHTTPCookieAcceptPolicy;

NSHTTPCookieAcceptPolicyAlways:接收所有cookie,默认策略.

NSHTTPCookieAcceptPolicyNever: 拒绝所有cookie

NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain:只接收main document domain中的cookie.

四.相关通知

NSHTTPCookieManagerCookiesChangedNotification

当NSHTTPCookieStorage实例中的cookies变化时发出此通知。

NSHTTPCookieManagerAcceptPolicyChangedNotification

当NSHTTPCookieStorage实例的cookie acceptance policy变化时发出此通知。

参考:

NSHTTPCookieStorage Class Reference

NSHTTPCookie Class Reference

URL Loading System Programming Guide – Cookie Storage

以上是对这两个类的综合介绍,如果有不懂,请自行百度或谷歌。



从网上看了一个自己手动管理cookie的例子:


我这个操作是保存NSHTTPCookieStorage对象里的所有cookie,当然也可以使用cookieForUrl来获取cookie进行保存,方便后续的使用。此操作是在登录的时候进行。

下面:


 这个方法就是更新cookie。在程序每次启动的时候调用一下。用来确保每次的cookie是最新的。

然后:


 这个方法就是移除你保存的cookie了。因为你在退出账户的时候需要重新获取新的cookie,所以,你需要在退出账户的时候清空你上次保存的cookie.   大概就是这么多操作

staticNSString*kLocalCookieName =@"MyProjectCookie";

staticNSString*kLocalUserData =@"MyProjectLocalUser";

staticNSString*kServerSessionCookie =@"JSESSIONID";


我们在工程中用的cookie是上方作用中的第二种,

-(void)setCookies{    NSString *cookie_value;    NSString *cookie_domain;    NSString *cookie_name;        NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL: [NSURL URLWithString:URL_LOGIN_CENTER]];    NSEnumerator *enumerat = [cookies objectEnumerator];    NSHTTPCookie *cookie;    while (cookie = [enumerat nextObject]) {        NSLog(@"COOKIE{name: %@, value: %@}", [cookie name], [cookie value]);        //            if ([[cookie name] isEqualToString:@"XXT_PSPT"]) {        cookie_value = [cookie value];        //            }        cookie_name = [cookie name];        if ([[cookie domain]isEqualToString:@".nmgxxt.cn"]) {            cookie_domain = @".xxt.cn";        }else{            cookie_domain = @".nmgxxt.cn";        }    }        NSLog(@"%@",cookie_value);    NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];    [cookieProperties setObject:cookie_name forKey:NSHTTPCookieName];    [cookieProperties setObject:cookie_value forKey:NSHTTPCookieValue];    [cookieProperties setObject:cookie_domain forKey:NSHTTPCookieDomain];    [cookieProperties setObject:cookie_domain forKey:NSHTTPCookieOriginURL];    [cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];    //            [cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];    //            [cookieProperties setObject:[NSDate dateWithTimeIntervalSinceNow:60*60] forKey:NSHTTPCookieExpires];//设置失效时间    [cookieProperties setObject:@"1" forKey:NSHTTPCookieDiscard]; //设置sessionOnly    NSHTTPCookie *cookieNew = [NSHTTPCookie cookieWithProperties:cookieProperties];    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookieNew];    }

我们对cookie进行操作,对domain进行设置,以后可以识别是访问哪个。这个cookie不是自己手动操作的,他有自己的存活时间,所以我们在重登陆的时候用的是账号密码,然后成功后还会调用setCookie这个方法进行设置,从而能够再次反访问该网址

4 0