//// ViewController.m// 04-POST请求模拟登录//// Created by Shenzhen_iOS_07 on 16/10/29.// Copyright © 2016年 Shenzhen_iOS_07. All rights reserved. /******************** MD5 加密简介 *****************************//* 1.md5简单的说就是对你对你的密码进行处理复杂化, 注意的是你单独对密码加密,怎么去和后台密码进行匹配,所以一般加密算法是后台提供的,,客户端和后台保证一致的加密算法才能匹配成功. 比如将"zhang"的字符创进行加密后得出"dgsjdfjsk32786^%#$%$^fmnnkdcjfsfds",这个字符串,我们就用这个字符串去登录后台服务器,后台服务器也会对"zhang"字符串进行加密由于算法相同得出的结果也会相同"dgsjdfjsk32786^%#$%$^fmnnkdcjfsfds". 所以匹配到后就登录成功了; 2.加密成功后在网路请求中传输的就是你加密后的密码,,,,别人不知道你的加密算法,是逆推不到你加密前的密码 3.使用操作很简单:首先直接拷贝"Security"文件夹导入到你的项目中,文件夹中包含各种字符串的加密算法..可供选择. 4.具体操作参考下列实例代码,实现过程简单,,注释很详细 */#import "MD5VC.h"#import "NSString+Hash.h"#import "SSKeychain.h"@interface MD5VC ()@property (weak, nonatomic) IBOutlet UITextField *nameTextField;@property (weak, nonatomic) IBOutlet UITextField *passwordTextField;@end@implementation MD5VC- (void)viewDidLoad { [super viewDidLoad]; // 程序一启动,就读取本地的用户信息;如果有,就展示到输入框.没有就自己输入 [self readUserInfo];}/* 加密 密码在网络中传输之前,加密 (MD5) 密码保存到本地之前,加密 (SSKeychain) 解密 密码在展示和使用之前,解密 (SSKeychain) */// POST请求模拟登录- (IBAction)login:(id)sender{ // 1.URL (POST请求的URL没有参数,参数封装在请求体) NSURL *URL = [NSURL URLWithString:@"http://localhost/php/login/login.php"]; // 2.创建请求可变对象 NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:URL]; // 2.1 设置请求方法为POST requestM.HTTPMethod = @"POST"; // 2.2 设置请求体 : 二进制的数据 requestM.HTTPBody = [self getHTTPBody]; // 2.获取单例session,发起任务,启动任务 [[[NSURLSession sharedSession] dataTaskWithRequest:requestM completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { // 3.处理响应 if (error == nil && data != nil) { // 4.反序列化 NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL]; // 5.判断是否登录成功 if ([result[@"userId"] intValue] == 1) { NSLog(@"登录成功"); // 登录成功之后,保存用户信息 [self saveUserInfo]; } else { NSLog(@"登录失败"); } } else { NSLog(@"%@",error); } }] resume];}// 获取请求体二进制的主方法- (NSData *)getHTTPBody{#pragma mark-MD5加盐,加两勺勺盐 : 后台设计的盐 NSString *salt = @"!@#ZXCasd258"; NSString *encodePsd = [self.passwordTextField.text hmacMD5StringWithKey:salt]; // 把加密之后的密码,放进请求体 NSString *body = [NSString stringWithFormat:@"username=%@&password=%@",self.nameTextField.text,encodePsd]; // 把请求体字符串转成二进制形式的请求体;dataUsingEncoding : 直接把字符串转成二进制 NSData *HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding]; return HTTPBody;}// 保存用户信息到偏好设置- (void)saveUserInfo{ // 保存用户名 [[NSUserDefaults standardUserDefaults] setObject:self.nameTextField.text forKey:@"name"]; // 需求 : 密码保存到本地,需要加密和能够解密 (钥匙串) /* 参数1 : 你要保存到钥匙串的密码 参数2 : APP的唯一标识符,为哪个APP保存密码 参数3 : 为哪个APP里面的哪个账号保存密码 提示 : 因为XCode8需要开启钥匙串的权限;XCode7不需要 */ BOOL isSaved = [SSKeychain setPassword:self.passwordTextField.text forService:[NSBundle mainBundle].bundleIdentifier account:self.nameTextField.text]; NSLog(@"%d",isSaved);}// 读取用户信息- (void)readUserInfo{ // 读取用户名 self.nameTextField.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"name"]; // 从钥匙串中读取密码 /* 参数1 : 读取哪个APP的密码 参数2 : 读取哪个APP的哪个账号的密码 */ NSString *decodePsd = [SSKeychain passwordForService:[NSBundle mainBundle].bundleIdentifier account:self.nameTextField.text]; // 读取密码 self.passwordTextField.text = decodePsd;}-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event
{
[self dismissModalViewControllerAnimated:YES];
}
@end