iOS UIWebview添加请求头的两种方式

1、在UIWebviewDelegate的方法中拦截request,设置request的请求头,废话不多说看代码:

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

NSString *urlString = [[request URL]  absoluteString];

NSLog(@"==> %@",urlString);

NSMutableURLRequest *mutableRequest = [request mutableCopy];

NSDictionary *requestHeaders = request.allHTTPHeaderFields;

// 判断请求头是否已包含,如果不判断该字段会导致webview加载时死循环

if (requestHeaders[@"token"] && requestHeaders[@"clienttype"]) {

return YES;

} else {

[mutableRequest setValue:@"token" forHTTPHeaderField:@"token"];

[mutableRequest setValue:@"ios" forHTTPHeaderField:@"clienttype"];

request = [mutableRequest copy];

[webView loadRequest:request];

return NO;

}

return YES;

}

经过本人亲测,这样做有一定问题,当在webview执行goBack方法时导致两个界面相互加载的情况,导致死循环加载无法返回,解决方法请参考以下更牛逼的方法2

2、写一个类继承NSURLProtocol,在 + (BOOL)canInitWithRequest:(NSURLRequest *)request 方法拦截request为request添加请求头,这样所有的webview操作请求都会调到这里,为request添加请求头,而且不影响webview的goBack方法返回

#import <Foundation/Foundation.h>

@interface KJURLProtocol : NSURLProtocol

@end

#import "KJURLProtocol.h"

@implementation KJURLProtocol

+ (void)load {

[NSURLProtocol registerClass:self];

}

+ (BOOL)canInitWithRequest:(NSURLRequest *)request {

if ([request isKindOfClass:[NSMutableURLRequest class]]) {

[(id)request setValue:@"ios" forHTTPHeaderField:@"clienttype"];

[(id)request setValue:[KJAppData instance].token forHTTPHeaderField:@"token"];

}

return NO;

}

@end

/********************************************************************************/

+ (BOOL)canInitWithRequest:(NSURLRequest *)request //在此方法决定是否拦截请求,return yes为拦截

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request //在此方法修改请求并返回

- (void)startLoading //执行特定的request请求

- (void)stopLoading //中断特定的request请求

/********************************************************************************/

附:iOS8一会苹果推出一个加载网页视图更吊的框架WebKit,其中的WKWebView 基本包含了UIWebview的所有东西,据说在性能方面优化的不是一点点,并添加了很多主流的东西,例如:实现网页之间的侧滑返回,估算网页的加载进度,如果你的应用已经最低支持iOS8,你还在由于什么,赶快尝试吧。

时间: 2024-08-08 01:06:56

iOS UIWebview添加请求头的两种方式的相关文章

ios给NSMutableDictionary循环赋值的两种方式,在循环内初始化NSMutableDictionary和在循环外初始化NSMutableDictionary有何区别?(已解决)

NSMutableArray * arrayName = [NSMutableArray array]; NSMutableArray * array = [NSMutableArray array]; [array removeAllObjects]; for (int i = 0; i< 10; i++) { NSString * str = [NSString stringWithFormat:@"name%i",i]; [arrayName addObject:str];

android/IOS常用图片上传的两种方式

android/IOS常用图片上传的两种方式: 1.上传到服务器的文件服务器(FileServer) 原理:上传到文件服务器的方式是先在服务器端搭建文件服务器,配置好路径(url),该路径是我们待会上传图片的路径,配置成功后便通过http+post的模式上传到文件服务器,同时文件服务器将返回一个图片ID,这个ID就是图片的唯一标识,并将该ID写入数据库保存,当需要下载该图片时只需要将此ID带上即可. 两个核心问题: (1)服务端:配置FileServer,并写处理响应上传图片的代码,这个值得去网

iOS中创建单例的两种方式

刚刚开始做iOS开发的时候,不知道怎么创建单例,在网上搜的也大多数都不太全,所以总结了一下创建单例的两种方式 首先在.h文件中声明类方法 1 +(instancetype)sharedUtils; 然后在.m文件中实现它,实现的方法有两种 第一种,在创建一个对象时先判断在程序中有没有创建过这个对象 1 static PublicUtils *DefaultManager = nil; 2 3 +(instancetype)sharedUtils 4 { 5 if (!DefaultManager

iOS:创建单例对象的两种方式

单例模式:创建单例对象的两种方式 方式一:iOS4版本之前 static SingleClassManager *singleManager = nil; +(SingleClassManager*)sharedManager { @synchronized(self)  //同步加锁,在多线程中使用,可以使线程安全 { if(singleManager == nil) { singleManager = [[SingleClassManager alloc]init]; } } return

IOS拦截重定向请求(302)的几种方式

前言 在多数情况下,我们做的网络请求是返回200状态码的,但也有返回302的时候,比如使用基于Oauth2认证协议的API时,在认证阶段,需要提供一个回调地址,当用户授权后,服务器会返回一个302 Response,Response Header中会一个Location字段,包含了我们的回调地址,同时会有一个Code参数.我们在程序中该如何处理这个请求,并拿到这个Code参数呢.下面由我来为大家讲解下几种方式的做法,各取所需. 假设您知道并使用过Oauth2认证协议 (一)UIWebView控件

struts2 添加请求后缀的3种方式

第一种方式在struts.xml文件中添加 <constant name="struts.action.extension" value=""></constant> 第二种方式在struts.properties中添加 第三种在web.xml的过滤器中添加 <!-- 定义Filter -->    <filter>        <!-- 指定Filter的名字,不能为空 -->        <f

IOS开发使用NSXMLParser、GDataXML两种方式解析XML数据

概括:XML数据解析方式有 *IOS原生的NSXMLParser,只支持SAX方式解析,使用简单 *C语言的libxml2,同时支持DOM和SAX方式解析 *google的GDataXML,只支持DOM方式解析,基于libxml2,使用时需要将编译环境配置为非ARC,并添加libxml2.dylib动态库 GDataXMLDocument 1 使用GDataXML的DOM方式解析XML,需要导入#import "GDataXMLNode.h" /** *  DOM方式解析XML数据 *

jmeter请求参数的两种方式

1.Parameters参数 2.Body Data形式,这种形式可以有两会中方式的参数书写形式 第一种:使用等号的形式,和拼接到url后的参数形式一样,如下图: 第二种:json格式的参数(json格式作为参数时候,需要添加Http信息头管理器,并且设置Content-Type为application/json),如下图: 设置htt信息头管理器 原文地址:https://www.cnblogs.com/danmai/p/8245449.html

JavaWeb获取请求参数的两种方式

第一种:通过获取缓冲流读取参数 public void registerUser(HttpServletRequest request, HttpServletResponse response)throws  Exception  { //直接获取请求参数,通过缓冲流读取数据  BufferedReader br=request.getReader();  String inputLine = "";  String json = "";      while (