Cookie的原理解析——利用服务器发送来的Cookie进行判断并保存一些信息

Cookie

(1)Cookie由服务器端生成,发送给客户端。

(2)客户端将Cookie的key/value 保存到某个目录下的文本文件内。

(3)如果客户端支持Cookie,下次请求同一网站时就可以Cookie直接发送给服务器。

(4)Cookie名称和值由服务器端开发自己定义。

Cookie 最典型的应用是判定注册用户是否已经登录,记录用户登录信息,简化下次登录的过程。比如:登陆一次不退出下一次不用再登录,Cookie一般只保存0或1判断登录状态。

另外一个最重要的应用场合是“购物车”。可以保存客户添加商品的信息,比如相机等,可以保存一个标示符。

另外需要注意的是Cookie是由服务器端生成并发送给客户端的,我们把本地服务器打开后,并在Sites(存放本地服务器网站的文件夹)中添加login2.html和login2.php ,并用正确的用户名和密码在火狐浏览器进行测试如下所示,登陆后再次重新登录发现生成了Cookie。


为了对比服务器端的login.php和login2.php有何不同 操作步骤如下:

右键Xcode图标——>Open Developer Tool——>FileMerge


选择login.php和login2.php 对比 不同之处如下:


验证如下:


代码如下:

<span style="font-size:18px;">//
//  ViewController.m
//  Cookie使用
//
//  Created by apple on 15/10/29.
//  Copyright (c) 2015年 LiuXun. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 跟踪服务器端返回的Cookie,都在NSHTTPCookieStorage单例对象内。
    // 如果服务器端每返回任何Cookie, 就对应一个NSHTTPCookie对象
    NSLog(@"%@", [NSHTTPCookieStorage sharedHTTPCookieStorage].cookies);
    
    // 以用户的登录为例进行演示从Cookie里面读取内容
    for (NSHTTPCookie *cookie in [NSHTTPCookieStorage sharedHTTPCookieStorage].cookies) {
        // 数组里面存放的是NSHTTPCookie对象
        // NSHTTPCookie对象里面有个properties属性字典
        // 字典里userName对应的值,就是服务器返回的cookie的内容
        // 字典里userPassword对应的值,就是服务器返回的cookie的内容
        NSLog(@"%@", cookie.properties);
        if ([cookie.name isEqualToString:@"userName"]) {
            NSLog(@"记录的用户名 %@", cookie.value);
        }else if ([cookie.name isEqualToString:@"userPassword"])
        {
            NSLog(@"记录的密码  %@", cookie.value);
        }
    }
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    // 1. url
    NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/login2.php"];
    
    // 2. 请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:2.0f];
    
    // 2.1
    request.HTTPMethod = @"POST";
    
    // 2.2 设置数据体
    //    NSString *body = @"username=zhangsan&password=zhang";
    //
    //    request.HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];
    
    
    // 3. 连接
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        NSError *error =nil;
        id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
        if (error) {
            NSLog(@"%@", [error localizedDescription]);
        }
        NSLog(@"%@", result);
        
    }];
    
}
@end</span>
第一次发送数据体,运行结果如下:



打开沙盒路径发现生成了Cookies文件夹,打开如下:


使用终端打开此Cookies文件夹内的文件如下:


第二次不发送数据体,重新运行如下:


说明第二次是客户端直接从沙盒Cookie文件中读取的第一次服务器端发送的Cookie信息。

另外 发现Cookie存放的是明文,不安全。只能存放一些别的信息,比如登录状态0或1 购物车等不涉及用户隐私的信息。那么如何判断并跟踪服务器发送到客户端的Cookies呢?

跟踪服务器端返回的Cookie都在NSHTTPCookieStorage单例对象内,每当服务器返回一个Cookie,就对应着一个NSHTTPCookie对象。NSHTTPCookieStorage单例对象的获取方法如下:

+ (NSHTTPCookieStorage *)sharedHTTPCookieStorage;

此单例对象有一个cookies属性数组,数组内的每一个元素都是每一个NSHTTPCookie对象

@property (readonly,copy)NSArray *cookies;

每一个NSHTTPCookie对象都有一个只读的properties字典属性

@property (readonly,copy)NSDictionary *properties;

每一个properties字典属性里都有一个name和value属性,与服务器端的Cookie相对相应。

具体使用如下:

//以用户的登录为例进行演示从Cookie里面读取内容

for (NSHTTPCookie *cookiein [NSHTTPCookieStoragesharedHTTPCookieStorage].cookies) {

//数组里面存放的是NSHTTPCookie对象

// NSHTTPCookie对象里面有个properties属性字典

//字典里userName对应的值,就是服务器返回的cookie的内容

//字典里userPassword对应的值,就是服务器返回的cookie的内容

NSLog(@"%@", cookie.properties);

if ([cookie.nameisEqualToString:@"userName"]) {

NSLog(@"记录的用户名 %@", cookie.value);

}elseif ([cookie.nameisEqualToString:@"userPassword"])

{

NSLog(@"记录的密码 %@", cookie.value);

}

}

打印Cookies内容,并取出指定的内容如下:



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值