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。

示意图.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信息:

<NSHTTPCookie version:0 name:"JSESSIONID" value:"7DD6A8E30F40E1D8515DB3A39FBF32C3" 
expiresDate:(null) created:2017-03-22 06:46:49 +0000 sessionOnly:TRUE 
domain:"cart.ev.com" partition:"none" path:"/cart-admin" isSecure:FALSE>

存储获取到的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];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 背景在HTTP协议的定义中,采用了一种机制来记录客户端和服务器端交互的信息,这种机制被称为cookie,cooki...
    时芥蓝阅读 2,488评论 1 17
  • 作者:晚晴幽草轩www.jeffjade.com/2016/10/31/115-summary-of-cookie...
    饥人谷_Dylan阅读 1,294评论 0 51
  • 注:本文转载自前端大全 背景 在HTTP协议的定义中,采用了一种机制来记录客户端和服务器端交互的信息,这种机制被称...
    楠小忎阅读 760评论 0 0
  • 1. cookie 1.1 什么是cookie cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过...
    cbw100阅读 4,235评论 0 13
  • 每过一段时间我都会重新去思考这两个字:善良。 善良是个有界限的词,但它没有边界,对于任何人都想用善良的心去对待。 ...
    小英的诗集阅读 241评论 0 0

友情链接更多精彩内容