在实际工作的项目中,有时会需要在webview的请求中添加认证,比如iOS中UIWebview添加headers认证请求;
- 一般的情况下我们可以在请求的时候直接添加headers,创建
NSMutableURLRequest
然后添加header[request setValue:@"header" forHTTPHeaderField: @"key"]
,这样可以最简单的添加header,用户在第一次请求网络的时候添加上header,然后就可以请求成功;当然这个方法虽然简单,但是有缺陷,因为在实际情况中,webview请求还需要跳转,例如我们在webview中点击链接跳转到下一个页面,这样header就就丢失了; - 我们知道在
UIWebviewDelegate
中有代理方法可以拦截到webview的URL请求;在-(BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)requestnavigationType (UIWebViewNavigationType)navigationType
的代理方法中我们可以获取requset的URL,然后通过修改request的URL来添加上我们需要的认证header.[request setValue:@"header" forHTTPHeaderField: @"key"]
,一切看似解决了,我们可以在每次URL访问代理是否要加载URL的时候来加上自己的header,这样每次Requset
请求都可实现。但是你如果在实际运行中你会发现request
请求中添加的header信息根本就没有被上传到服务器。 - 通过在网络上查看资料,发现了一种能彻底解决这个问题的方法,那就是通过
NSURLProtocol
的方法,咋看之下,你可能认为NSURLProtocol
是一个代理,实际上它是一个OC中的抽象基类。继承于NSURLProtocol的一个子类MyURLProtocol,我们在其类方法canonicalRequestForRequest
修改request
的头信息,这样我们就可以实现我们想要的功能了。 当然NSURL还有更多强大的功能,在以后实际项目中需要的时候,可以再使用;我把自己学习的demo托管到本人的 github上面了,需要的话可以下载看看
参考网站: https://www.raywenderlich.com/59982/nsurlprotocol-tutorial