iOS网页wkwebview拦截请求,添加头文件

iOS网页wkwebview拦截请求,添加头文件,第1张

遇到一个需求:在网页抛出一切请求时,不管是资源请求还是重定向等,需要拦截掉并在header添加信息,ng拿到去做处理,访问不同资源服务器。

一开始想到的方式是:通过WKNavigationDelegate的代理方法- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler

来在请求之前获得请求信息,并把请求头信息添加进去,如下:

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

    NSLog(@"灰度测试h5Url: %@",navigationAction.request.URL.absoluteString)

    if ([navigationAction.request.URL.absoluteString containsString:OUR_URL_ID]) {

        // 拦截所有网络请求头,重新添加参数请求头信息

        NSMutableURLRequest *mutableRequest = [navigationAction.request mutableCopy]

        NSDictionary *requestHeaders = navigationAction.request.allHTTPHeaderFields

        if ([requestHeaders isKindOfClass:[NSDictionary class]]) {

            //简单通过Version_Key判断下是否已经加入了请求信息

            if ([AFNetWorkManager KeyUrlrequestOneNull:requestHeaders]) {

                [AFNetWorkManager addWebDefaultKeyUrlrequest:mutableRequest]

                [webView loadRequest:mutableRequest]

                NSLog(@"灰度测试h5Url: %@ \n请求头:%@",navigationAction.request.URL.absoluteString,mutableRequest.allHTTPHeaderFields)

                decisionHandler(WKNavigationActionPolicyCancel)

                return

            }else{

                //参数正常,放开请求

                NSLog(@"灰度测试h5Url: %@ \n请求头:%@",navigationAction.request.URL.absoluteString,requestHeaders)

                decisionHandler(WKNavigationActionPolicyAllow)

            }

        }else{

            //没有请求头,加上新的请求头,并赋予参数

            mutableRequest.allHTTPHeaderFields = [NSMutableDictionary new]

            [AFNetWorkManager addWebDefaultKeyUrlrequest:mutableRequest]

            [webView loadRequest:mutableRequest]

            NSLog(@"灰度测试h5Url: %@ \n请求头:%@",navigationAction.request.URL.absoluteString,mutableRequest.allHTTPHeaderFields)

            decisionHandler(WKNavigationActionPolicyCancel)

        }

    }else{

        //本地请求资源,pdf等

        decisionHandler(WKNavigationActionPolicyAllow)

    }

}

但是经过打印发现,只拦截了一些html请求,向png、css、js资源请求,并没有拦截到,甚至没有走这个方法。

无奈,只能网上搜索,结果发现了:https://github.com/fenglee594/WKWebViewRequestHook

这个demo,稍加改动,亲测有效。

seaweedfs源码文档链接git地址

官网配置security.toml步骤

1.1: 命令生成security.toml: weed scaffold -config=security

1.2: 通过openssl生成CA证书,并生成客户端证书和密钥(此处我没有用官网提供的 https://github.com/square/certstrap 的插件进行生成,原因是执行命令 go build 时候一直报错,提示timeout,找不到gopass插件

1.3: 生成的security.toml文件放到跟weed同级目录下即可,seaweedfs如何安装请 传送门 参考这篇文章

1.4: 使用方法,获取文件生成的token

1.5: 至此文件读权限校验加入成功

seaweedfs使用jwt自身token鉴权

优点:

1.可以完全脱离项目业务逻辑,实现自身权限控制,自签自验(自己签发Authorization,自己验证Authorization)

2.可以自己设置Authorization的有效期,实现阶段性读取权限限制

缺点

1.图片链接需要在请求头中加入Authorization信息,h5中<img>标签无法直接在图片链接中加入请求头信息 。

2.每一个文件读取都需要根据文件id申请一个Authorization信息, *** 作稍显繁琐

关于文件访问权限控制,另一种方案,可看 linux 安装openresty并使用lua脚本转发鉴权控制文件访问权限 文章

从业这么久遇到的问题无数,之前只为解决问题各种尝试,解决就可,没做个笔记,从各位前人借鉴,真真是体验到前人种树,后人乘凉,但是我参照前人的文还是没有解决掉,各种研究,最后感谢以为大神的demo提醒了我

。谢谢,您能感受到我这虔诚的感谢的磁场吗。话不多说,开始

1.这个一定是要配置的,在info里面配置

LSApplicationQueriesSchemes 

2.设置Referer这个请求头的参数,当然微信也给出了例子 微信h5支付其他常见错误 。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

NSDictionary *headers = [request allHTTPHeaderFields]

BOOL hasReferer = [headers objectForKey:@"Referer"] != nil

if (hasReferer) {

// .. is this my referer?

return YES

} else {

// relaunch with a modified request

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

dispatch_async(dispatch_get_main_queue(), ^{

NSURL *url = [request URL]

NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]

[request setHTTPMethod:@"GET"]

[request setValue:@"www.xxx.com://" forHTTPHeaderField: @"Referer"]

                [self.myWebView loadRequest:request]

})

})

return NO

}

}

这个http://www.xxx.com就是你们商户申请H5时提交的授权域名.

3.这个要设置 啊,作为返回的唯一关联

4.h5需要配合一下啦

redirect_url 之前是一个完整的订单页面,但是这不行啊,支付完成就会跳转到自带浏览器,好烦躁。

然后呢,我们的后台兼前端大神,说给我一个 和我的schemse一样的字段 + 订单页面url,让我试试,然后。。。没有然后了,完美了。 ps:等等,当然一定要做一个字符串截取,截取到订单页,不然返回来的页面还是未支付的,岂不是很尴尬。 https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?xxxx=xxx&xxx=x..........&redirect_url=xxx.h5支付域名.com://xxx.xxx.com/shop/payCallBack?orderId=xxxxx .

截取到 xxx.xxx.com/shop/payCallBack?orderId=xxxxx .,再加上一个前缀拼接。OK,美滋滋。

此文,解决问题为主哈哈,有其他建议、意见,或者更好的办法统统提上来,共同进步哈。

对了配上大神的截图


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11929800.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存