GETPOST请求和加密解密
⼀、GET/POST⽅法简介&⽤户安全
1、GET/POST⽅法简介
在客户端和服务器之间进⾏请求-响应时,两种最常被⽤到的⽅法是:GET 和 POST。
> GET - 从指定的资源请求数据。
* GET 请求可被缓存,可以保留在浏览器历史记录中,可被收藏为书签。
* GET 请求从数学⾓度来讲,GET的结果是 幂等 的
* GET 请求有长度限制,在HTTP协议定义中,没有对GET请求的数据⼤⼩限制,不过因为浏览器不同,⼀般限制在2~8K。
* GET 请求的所有参数包装在URL中,并且服务器的访问⽇志会记录,不要传递敏感信息。
* 参数格式
>> 在资源路径末尾添加 ? 表⽰追加参数
>> 每⼀个变量及值按照 变量名=变量值 ⽅式设定,不能包含空格或中⽂
>> 多个参数使⽤ & 连接
>> URL 字符中如果包含中⽂,需要添加百分号转义。
# 在数学中,⼀个数多次进⾏该运算所得的结果和进⾏⼀次该运算所得的结果是⼀样的,那么我们就称该运算是幂等的。⽐如绝对值运算就是⼀个例⼦,在实数集中,有abs(a)=abs(abs(a))。
# GET的结果是 幂等 的,是说对同⼀个URL请求多次获得的结果都是⼀样的。
> POST - 向指定的资源提交要被处理的数据
* POST 请求不会被缓存,不会保留在浏览器历史记录中,不能被收藏为书签
* POST 向服务器发送数据,也可以获得服务器处理之后的结果,效率不如GET
* POST 提交数据⽐较⼤,⼤⼩靠服务器的设定值限制,PHP通常限定2M。
* POST 提交的参数包装成⼆进制的数据体,格式与 GET 基本⼀致,只是不包含 ?
* URL中 只有资源路径,但不包含参数,服务器⽇志不会记录参数,相对更安全。
* 所有设计⽤户隐私的数据(密码,银⾏卡号)⼀定记住使⽤POST⽅式传递。url编码和utf8区别
2、浏览器演⽰GET/POST请求的区别。
3、GET缓存实现
> Request缓存请求头
* If-None-Match : 与响应头的Etag相对应,可以判断本地缓存数据是否发⽣变化。
> GET⽅法缓存演练
/*
1、请求是可变的,缓存策略要每次都从服务器加载
2、每次得到响应后,需要记录 etag
3、下次发送请求的同时,将 etag ⼀起发送给服务器,由服务器⽐较内容有没有变
*/
-
(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSURL *url = [NSURL URLWithString:@"localhost/itcast/images/head1.png"];
// NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:15.0];
// 传递 etag
if (ag.length > 0) {
[request ag forHTTPHeaderField:@"If-None-Match"];
}
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSLog(@"%@,%zd",response,data.length);
// 类型转换(在oc中,如果将⽗类转换成⼦类需要强制转换)
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
// 获取并记录 etag,区分⼤⼩写
// 判断响应状态码是否是 304 Not Modified
if (httpResponse.statusCode == 304) {
NSLog(@"加载本地数据");
// 如果是,使⽤本地缓存
// 根据请求获得被缓存的响应
NSCachedURLResponse *cacheResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request]; // 拿到缓存的数据
data = cacheResponse.data;
}
NSLog(@"etag = %@",ag);
self.iconView.image = [UIImage imageWithData:data];
}];
}
> 代码⼩结
* 请求的缓存策略使⽤NSURLRequestReloadIgnoringCacheData,忽略本地缓存
* 服务器响应结束后,要记录 Etag,服务器内容和本地缓存对⽐是否变化的重要依据
* 在发送请求时,设置 If-None-Match,并且传⼈ Etag
* 连接结束后,要判断响应头的状态码,如果是304,说明本地缓存内容没有变化。
4、NSURLCache--设置缓存
> 在iOS中,可以使⽤NSURLCache类缓存数据
// 设置⽹络缓存
// 4M 的内存缓存
// 20M 的磁盘缓存
// diskPath:缓存路径 nil:表⽰使⽤系统默认的缓存路径:沙盒/Library/Caches
NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:@"pkxing"];
// 设置全局缓存
[NSURLCache setSharedURLCache:cache];
> iOS 5之前:只⽀持内存缓存。从iOS 5开始:同时⽀持内存缓存和硬盘缓存
# AFNetworking的作者Mattt说:⽆数开发者尝试⾃⼰做⼀个简陋⽽脆弱的系统来实现⽹络缓存功能,殊不知 NSURLCache 只要两⾏代码就能搞定且好上100倍。
⼆、⽤户登录
1、GET登录
> 代码演⽰
/**
* GET⽅式登录
*/
- (void)getLogin{
// 创建url
NSString urlStr = [NSString stringWithFormat:@"localhost/login.php?
username=%@&password=%@",self.userName,self.password];
// 如果url 字符串中,包含中⽂或空格等特殊字符,需要添加百分号转义
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlStr];
// 创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 请求的默认⽅法就是 GET
NSLog(@"%@",request.HTTPMethod);
// 发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
NSLog(@"%@,%@",response,dict);
}];
}
> URL编码
* Url编码通常也被称为百分号编码(Url Encoding,also known as percent-encoding),是因为它的编码⽅式⾮常简单,使⽤%百分号加上两位的字符——0123456789ABCDEF——代表⼀个字节的⼗六进制形式。
* Url编码默认使⽤的字符集是ASCII
1、 为什么需要编码?
> url⽀持26个英⽂字母、数字和少数⼏个特殊字符,因此,对于url中包含⾮标准url的字符时,就需要对其进⾏编码。
2、 如何编码?
NSString urlStr = [NSString stringWithFormat:@"localhost/login.php?
username=%@&password=%@",self.userName,self.password];
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
> GET请求缓存的位置
* GET请求返回的json数据缓存在Caches/bundleId/Cache.db的sqlite数据库中。
* 通过终端查看:进⼊到 Caches.db 所在的⽂件夹,
> 执⾏命令 sqlite3 Cache.db; 打开数据库
> 执⾏命令 .tables; 可查看数据库的表
> 执⾏命令 select * from 表名;可查看对应的表数据,即缓存内容。
2、 POST登录
/**
* POST⽅式登录
*/
- (void)postLogin{
// 创建url
NSURL *url = [NSURL URLWithString:@"localhost/login.php"];
// 创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 设置请求⽅法为 POST
request.HTTPMethod = @"POST";
// 设置请求体⼆进制数据
NSString *bodyStr = [NSString stringWithFormat:@"username=%@&password=%@",self.userName,self.password];
#warning HTTPBody 和 HTTPBodyStream 只需要设置其中⼀个就⾏了,如果两个都设置了,前⾯设置的就⽆效了。
// request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
request.HTTPBodyStream = [[NSInputStream alloc] initWithData:[bodyStr dataUsingEncoding:NSUTF8StringEncoding]];
// 发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
NSLog(@"%@,%@",response,dict);
}];
}
3、POST和GET请求的对⽐
> URL对⽐
* GET
1、login.php 负责登录的脚本,提⽰:上课使⽤的是 php,⽽⼯作中不⼀定,可能是.jsp,取决于后台,后台提供什么,客户端就⽤什么。
2、‘?’ 表⽰接参数
3、参数格式:变量名=值
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论