iOS【Cookie】session用户登录状态与断开

SessionID的本质

一、客户端用cookie保存了sessionID

客户端用cookie保存了sessionID,当我们请求服务器的时候,会把这个sessionID一起发给服务器,服务器会到内存中搜索对应的sessionID,如果找到了对应的 sessionID,说明我们处于登录状态;如果没找到,这说明:要么是我们把浏览器关掉了,要么session超时了,session被服务器清除了,则服务器会给你分配一个新的sessionID。你得重 新登录并把这个新的sessionID保存在cookie中。

在没有把浏览器关掉的时候(这个时候假如已经把sessionID保存在cookie中了)这个sessionID会一直保存在浏览器中,每次请求的时候都会把这个sessionID提交到服务器,所以服务器认为我们是登录的;如果长时间没有请求服务器,服务器会认为我们已经把浏览器关掉了,这个时候服务器会把该sessionID从内存中清除掉,这个时候我们再去请求服务器的话,sessionID已经不存在了,服务器在内存中没有找到对应的 sessionID,所以会再产生一个新的sessionID,这个时候一般我们又要再登录一次。

二、客户端没有用cookie保存sessionID

这 个时候如果我们请求服务器,因为没有提交sessionID上来,服务器会认为你是一个全新的请求,服务器会给你分配一个新的sessionID,这就是 为什么我们每次打开一个新的浏览器的时候(无论之前我们有没有登录过)都会产生一个新的sessionID(或者是会让我们重新登录)。

当我们一旦把浏览器关掉后,再打开浏览器再请求该页面,它会让我们登录,这是为什么?我们明明已经登录了,而且还没有超时,sessionID肯定还在服 务器上的,为什么现在我们又要再一次登录呢?这是因为我们关掉浏览再请求的时候,我们提交的信息没有把刚才的sessionID一起提交到服务器,所以服 务器不知道我们是同一个人,所以这时服务器又为我们分配一个新的sessionID。

iOS【Cookie】session用户登录状态与断开_第1张图片
示意图.png

1、server通过HTTP Response中的"Set-Cookie: header"把cookie发送给client
2、client把cookie通过HTTP Request 中的“Cookie: header”发送给server
3、每次HTTP请求,Cookie都会被发送。

http请求发送cookies的条件:

1、本地已经缓存有cookies
2、根据请求的URL来匹配cookies的domain、path属性,如果都符合才会发送。[url的匹配规则]

iOS客户端:cookies会保存在App的沙盒下

退出登录(清除Cookie)

+ (void)exitCleanCookies{

    //Host : http://cart.ev.com/cart-admin/
    //获取BaseUrl 的Cookie  
    NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL: [NSURL URLWithString:Host]];

    for (NSHTTPCookie * cookie in cookies){
        //清除本地的Cookie (退出登录)
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }
}

Cookie信息:


存储获取到的Cookie

NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
NSData * cookiesData = [NSKeyedArchiver archivedDataWithRootObject: cookies ];
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject: cookiesData forKey:kCookie];
[defaults synchronize];

设置本地的Cookie

NSData  *cookieData =  [[NSUserDefaults standardUserDefaults] objectForKey:kCookie];
NSArray * cookies = [NSKeyedUnarchiver unarchiveObjectWithData: cookieData];
NSHTTPCookieStorage * cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie * cookie in cookies){
    [cookieStorage setCookie: cookie];
}

给链接设置Cookie

NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
[cookieStorage setCookies:cookies forURL:url mainDocumentURL:nil];

客服端创建Cookie

NSHTTPCookie *cookie = [[NSHTTPCookie alloc] initWithProperties:@{NSHTTPCookieName:@"username",
                                                                  NSHTTPCookieValue:@"test",
                                                                  NSHTTPCookiePath:@"/",
                                                                  NSHTTPCookieDomain:@"https://www.baidu.com"}];

NSHTTPCookieStorage * cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
[cookieStorage setCookies:@[cookie] forURL:baseUrl mainDocumentURL:nil];

你可能感兴趣的:(iOS【Cookie】session用户登录状态与断开)