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。
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];