UIWebView实现自动登陆

http://www.jianshu.com/p/072bbc1e4c33


IOS中UIWebView不会自动存储、读取Cookie.
要实现UIWebView的自动登陆,需要手动存储、读取Cookie.
1.Appelegate.m中加入以下代码

- (void)applicationDidBecomeActive:(UIApplication *)application 
{    
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
    //存储Cookie,示例加载的URL:http://119.29.69.58:81/index
    NSURL * cookieHost = [NSURL URLWithString:@"http://119.29.69.58:81"];
    NSHTTPCookie * cookie = [NSHTTPCookie cookieWithProperties:
    [NSDictionary    dictionaryWithObjectsAndKeys:
    [cookieHost host],NSHTTPCookieDomain,
    [cookieHost path],NSHTTPCookiePath,
    @"COOKIE_NAME",NSHTTPCookieName,
    @"COOKIE_VALUE",NSHTTPCookieValue,nil]];
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}

2.UIWebView加载URL时设置Header

NSURL * url = [NSURL URLWithString:@"http://119.29.69.58:81/index"];
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
NSArray * cookies = [[NSHTTPCookieStorage  sharedHTTPCookieStorage] cookies];
NSDictionary * headers = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];
[request setHTTPMethod:@"POST"];
[request setHTTPShouldHandleCookies:YES];
[request setAllHTTPHeaderFields:headers];
[self.WebView loadRequest:request];

3.退出登陆时删除Cookie

//清空Cookie
NSHTTPCookieStorage * myCookie = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie * cookie in [myCookie cookies])
{
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
}

//删除沙盒自动生成的Cookies.binarycookies文件       
NSString * path = NSHomeDirectory();
NSString * filePath = [path stringByAppendingPathComponent:@"/Library/Cookies/Cookies.binarycookies"];
NSFileManager * manager = [NSFileManager defaultManager];
[manager removeItemAtPath:filePath error:nil];


文/iGeekXi(简书作者)
原文链接:http://www.jianshu.com/p/072bbc1e4c33
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

//---------------------------------------------------------------------------------------------
http://blog.csdn.net/assholeu/article/details/38585243

一些说明:

  1. 通过UIWebView登录后,会自动得到web服务器设置的cookie包括服务器中的seesionid。
  2. cookie不会自动保存在app里面,需要通过设置才能在下次启动app时获取。
  3. 自动登录,需要设置header,才能将cookie带给web服务器。
  4. 自动登录,需要web服务器端进行cookie验证方可登录。

实现流程:

1. 做好Sign in页面后,通过get或post递交表单给web服务器,可以通过下面的代码遍历得到的cookie。
[objc]  view plain  copy
 
  1. NSHTTPCookieStorage *myCookie = [NSHTTPCookieStorage sharedHTTPCookieStorage];  
  2.             for (NSHTTPCookie *cookie in [myCookie cookies]) {  
  3.                 NSLog(@"%@", cookie);  
  4.             }  

2. 为了实现自动登录,需要将cookie保存下来,以便自动登录,只需要加上一行代码。
[objc]  view plain  copy
 
  1. NSHTTPCookieStorage *myCookie = [NSHTTPCookieStorage sharedHTTPCookieStorage];  
  2.             for (NSHTTPCookie *cookie in [myCookie cookies]) {  
  3.                 NSLog(@"%@", cookie);  
  4.                 [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie]; // 保存  
  5.             }  

3. 自动登录时,需要将上次保存的cookie取出来设置header拿给web服务器,代码如下。
[objc]  view plain  copy
 
  1. // 寻找URL为HOST的相关cookie,不用担心,步骤2已经自动为cookie设置好了相关的URL信息  
  2. NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:[NSURL URLWithString:HOST]]; // 这里的HOST是你web服务器的域名地址  
  3. // 比如你之前登录的网站地址是abc.com(当然前面要加http://,如果你服务器需要端口号也可以加上端口号),那么这里的HOST就是http://abc.com  
  4.   
  5. // 设置header,通过遍历cookies来一个一个的设置header  
  6. for (NSHTTPCookie *cookie in cookies){  
  7.   
  8. // cookiesWithResponseHeaderFields方法,需要为URL设置一个cookie为NSDictionary类型的header,注意NSDictionary里面的forKey需要是@"Set-Cookie"  
  9.         NSArray *headeringCookie = [NSHTTPCookie cookiesWithResponseHeaderFields:  
  10.                                     [NSDictionary dictionaryWithObject:  
  11.                                      [[NSString alloc] initWithFormat:@"%@=%@",[cookie name],[cookie value]]  
  12.                                                                 forKey:@"Set-Cookie"]  
  13.                                                                          forURL:[NSURL URLWithString:HOST]];  
  14.   
  15. // 通过setCookies方法,完成设置,这样只要一访问URL为HOST的网页时,会自动附带上设置好的header  
  16.         [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies:headeringCookie  
  17.                                                            forURL:[NSURL URLWithString:HOST]  
  18.                                                   mainDocumentURL:nil];  
  19.     }  

4. web服务器验证app带过来的cookie信息,来完成登录。
如果访问的页面没有cookie验证的代码,那么就访问那些*loginAction之类有验证cookie的页面再跳转,或者告诉同事在你访问的那个页面加个cookie验证登录的就行了。


BB:转载请注明出处:http://blog.csdn.net/assholeu/article/details/38585243

你可能感兴趣的:(ios)