zoukankan      html  css  js  c++  java
  • wkwebview免登录,配置cookie,免登陆

    需求:纯webapp第一次登录记住账号密码,退出app,下次启动时候免登录

    第一步:

    创建wkwebview对象时,选择自定义配置加载网页是携带cookie。如果本地存有上次登录保留的cookie,那么直接将cookie配置到wkwebview,可以在加载后面的页面是自动携带cookie,本地没有缓存cookie,则跳转登录页.

    - (WKWebView *)webView

    {

    if (_webView == nil)

    {

            WKUserContentController *userContrntController = [[WKUserContentController alloc] init];

            WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];

            config.userContentController = userContrntController;

            WKProcessPool *processpool = [[WKProcessPool alloc] init];

            config.processPool = processpool;

            

            WKUserScript *cookieScript = [[WKUserScript alloc] initWithSource:[self cookieJavaScriptString] injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];

            [userContrntController addUserScript:cookieScript];

            

    _webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height-kNavigationBarHeight) configuration:config];

    _webView.navigationDelegate = self;

            _webView.UIDelegate = self;

    _webView.allowsBackForwardNavigationGestures = YES;

    }

     

    return _webView;

    }

    第二步:

    获取本地cookie,cookie本地持久化用网页urlHost作为键值,保证需要同一个cookie的网页通过urlHost获取对应cookie,从本地取出cookie的内容

    //配置config,获取cookieString

    - (NSString *)cookieJavaScriptString

    {

        NSMutableString *cookieString = [[NSMutableString alloc] init];

        NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];

        NSDictionary *cookieDic = [userDefault objectForKey:self.urlHost];

        for (NSString *key in cookieDic) {

            NSHTTPCookie *cookie = [[NSHTTPCookie alloc] initWithProperties:[cookieDic objectForKey:key]];

            NSString *excuteJSString = [NSString stringWithFormat:@"document.cookie='%@=%@';",cookie.name,cookie.value];

            [cookieString appendString:excuteJSString];

        }

        return cookieString;

    }

    第三步:

    在网页跳转之前,向服务器发送请求之前先判断是否携带cookie,如果没有携带cookie,取消跳转,手动添加cookie在跳

    //发送请求之前,决定是否跳转

    - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(nonnull WKNavigationAction *)navigationAction decisionHandler:(nonnull void (^)(WKNavigationActionPolicy))decisionHandler

    {

        self.urlHost = navigationAction.request.URL.host;

        if (self.urlHost) {

            if (!navigationAction.request.allHTTPHeaderFields[@"Cookie"]) {

                decisionHandler(WKNavigationActionPolicyCancel);

                [self loadRequestWithString:navigationAction.request.URL];

            } else {

                decisionHandler(WKNavigationActionPolicyAllow);

            }

        } else {

            decisionHandler(WKNavigationActionPolicyAllow);

        }

    }

     

    //手动添加cookie

    - (void)loadRequestWithString:(NSURL *)url

    {

        NSMutableString *cookieValue = [NSMutableString string];

        NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];

        NSDictionary *cookieDic = nil;

        if (self.urlHost) {

            cookieDic = [userDefault objectForKey:self.urlHost];

        }

        

        for (NSString *key in cookieDic) {

            NSHTTPCookie *cookie = [[NSHTTPCookie alloc] initWithProperties:[cookieDic objectForKey:key]];

            NSString *appendString = [NSString stringWithFormat:@"%@=%@",cookie.name,cookie.value];

            [cookieValue appendString:appendString];

        }

        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

        [request addValue:cookieValue forHTTPHeaderField:@"Cookie"];

        [self.webView loadRequest:request];

    }

    第四步:

    保存cookie,第一次或第cookie失效的时候需要登录,成功之后将网页请求的cookie保存在本地,下次加载需要使用

    //接收到响应后,决定是否跳转

    - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(nonnull WKNavigationResponse *)navigationResponse decisionHandler:(nonnull void (^)(WKNavigationResponsePolicy))decisionHandler

    {

        //将获取的cookie本地化

        NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];

        NSMutableDictionary *cookieDic = [[NSMutableDictionary alloc] initWithDictionary:[userDefault objectForKey:self.urlHost]];

        NSHTTPURLResponse *response = (NSHTTPURLResponse *)navigationResponse.response;

        NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:response.URL];

        for (NSHTTPCookie *cookie in cookies) {

            [cookieDic setObject:[cookie properties] forKey:cookie.name];

        }

        [userDefault setObject:cookieDic forKey:self.urlHost];

        decisionHandler(WKNavigationResponsePolicyAllow);

    }

    注意:我这里的slef.urlHost默认是请求h5的域名

  • 相关阅读:
    游标,存储过程
    利用IDEA构建springboot应用-如何优雅的使用mybatis
    PLSQL编程
    利用IDEA构建springboot应用-数据库操作(Mysql)
    01-常见Dos命令、Java历史、Java跨平台、配置Path环境变量、第一个HelloWorld例子
    利用IDEA构建springboot应用-Controller的使用
    利用IDEA构建springboot应用-配置文件
    SharePoint和Outlook组合构建日历提醒功能
    SharePoint隐藏快速启动栏_左侧导航_所有网站内容_回收站
    使用SharePoint Designer创建子网站时,无法找到常见模板
  • 原文地址:https://www.cnblogs.com/ljj-Andrew-519/p/9269981.html
Copyright © 2011-2022 走看看