1. 程式人生 > >Cookie的原理解析——利用伺服器傳送來的Cookie進行判斷並儲存一些資訊

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內容,並取出指定的內容如下: