Post,同步实现登陆验证(2)

简介: 前一章用MKNetworkit和Express模拟了登陆验证的功能,但是在实际应用中会出现一个问题,就是MKNetworkit并不支持同步,也就是说在登陆验证的时候,可能服务器数据还未返回,就已经开始了下一步操作,比如说跳转到下个界面。比较简单地解决方法就是用Rest web Service基础的同步get,post方法实现登陆验证。直接上代码:-(void)

前一章用MKNetworkit和Express模拟了登陆验证的功能,但是在实际应用中会出现一个问题,就是MKNetworkit并不支持同步,也就是说在登陆验证的时候,可能服务器数据还未返回,就已经开始了下一步操作,比如说跳转到下个界面。

比较简单地解决方法就是用Rest web Service基础的同步get,post方法实现登陆验证。

直接上代码:

-(void)loginpost:(NSString*)user pwd:(NSString*)password{
    [GMDCircleLoader setOnView:self.view withTitle:@"Loading..." animated:YES];//一个第三方的活动指示器
//    [self.act startAnimating];
//    [self.view addSubview:self.act];

    NSURL* host = [NSURL URLWithString:@"http://127.0.0.1:3000/login?"];
    NSString* path = [[NSString alloc]initWithFormat:@"user=%@&password=%@",user,password];
    NSData* pathdata = [path dataUsingEncoding:NSUTF8StringEncoding];//post内容序列化

    NSMutableURLRequest* req = [[NSMutableURLRequest alloc]initWithURL:host cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
    [req setHTTPMethod:@"POST"];
    [req setHTTPBody:pathdata];
    NSError* e=nil;

    NSData* recivedata = [NSURLConnection   
           sendSynchronousRequest:req
           returningResponse:nil error:&e];//同步请求
    if(e){//连接服务器错误
    [NSTimer scheduledTimerWithTimeInterval:3.0 
    target:self selector:@selector(connectfailed:) 
    userInfo:[e localizedDescription] 
    repeats:NO];
        return;
    }

    //成功返回数据
    if(recivedata){
        NSError* er = nil;
        NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:recivedata options:NSJSONReadingAllowFragments error:&er];
        if(!er){
            NSString* rescode = [dict valueForKey:@"resultcode"];
            if([rescode isEqualToString:@"true"]){
                [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(logined) userInfo:nil repeats:NO];
            }else{
                [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(loginedfailed) userInfo:nil repeats:NO];


            }

        }

    }   
}

登陆验证的时候会有三种情况,一种根本连不上数据库,一种用户名或者密码错误,一种登陆成功。这里加上活动指示器,是为了防止和服务器通信时间过长导致的主界面“假死”。

//链接失败
-(void)connectfailed:(NSTimer*)timer{
    [GMDCircleLoader hideFromView:self.view animated:YES];
//    [self.act stopAnimating];
//    [self.act removeFromSuperview];
    NSLog(@"conenctd failed");
    UIAlertView* alter = [[UIAlertView alloc]initWithTitle:@"错误" message:[timer userInfo] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
    [alter show];
}
//登陆成功
-(void)logined{
    [GMDCircleLoader hideFromView:self.view animated:YES];
//    [self.act stopAnimating];
//    [self.act removeFromSuperview];
    NSLog(@"login success!");
    [self performSegueWithIdentifier:@"showdetail" sender:self];
}

//用户名或密码错误
-(void)loginedfailed{
    [GMDCircleLoader hideFromView:self.view animated:YES];
//    [self.act stopAnimating];
//    [self.act removeFromSuperview];
     NSLog(@"login failed!");
    UIAlertView* alter = [[UIAlertView alloc]initWithTitle:@"登陆失败" message:@"用户名或密码错误" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alter show];

}

这里用了个第三方的活动指示器,具体链接:
https://github.com/gabemdev/GMDCircleLoader
注释掉的都是自带的UIActivityIndicatorView,使用方法也很简单,直接在
viewDidLoad中初始化:

self.size = self.view.frame.size;
self.act = [[UIActivityIndicatorView alloc]initWithFrame:CGRectMake(self.size.width/2-50, self.size.height/3, 100, 50)];
self.act.activityIndicatorViewStyle=UIActivityIndicatorViewStyleGray;//指示器类型
 //设置活动指示器的颜色
 elf.act.color=[UIColor redColor];
 //hidesWhenStopped默认为YES,就是只有在指示器运行的时候才显示
 self.act.hidesWhenStopped=YES;

项目文件:
https://github.com/tyrantkemp/login.git

相关文章
|
5月前
layui 请求返回401token 过期 重新登陆
layui 请求返回401token 过期 重新登陆
|
10月前
|
Web App开发 网络协议 安全
GET和POST方式请求API接口数据返回
GET和POST方式请求API接口数据返回
108 0
|
JSON 缓存 中间件
Django 跨域访问POST请求需预先发送option请求问题处理方案
Django 跨域访问POST请求需预先发送option请求问题处理方案
248 0
|
JSON 数据格式
axios.post提交的三种请求方式
axios.post提交的三种请求方式
|
Java API 数据库
请求地址中主动携带Cookies信息通过登录验证
最近在做一个机关单位的项目,他们的项目基本都是部署在内部网络中,并且都做了单点登录验证,即就是该网站上挂载了许多的系统和应用,访问其中的某一个系统和应用的时候,都会被单点登录拦截在登录页面,必须登录该网站,才能访问其中的系统及应用
107 0
请求地址中主动携带Cookies信息通过登录验证
|
JSON JavaScript 数据格式
封装获取用户 post 提交的数据的方法|学习笔记
快速学习封装获取用户 post 提交的数据的方法
278 0
封装获取用户 post 提交的数据的方法|学习笔记
|
JavaScript
post方式进行无刷新删除
post方式进行无刷新删除
151 0
|
缓存 小程序
小程序异步请求token解决办法
小程序异步请求token解决办法
287 0
|
网络协议 iOS开发
NSURLProtocol 拦截 NSURLSession 请求时body丢失问题解决方案探讨
“IP直连方案”主要在于解决DNS污染、省去DNS解析时间,通常情况下我们可以在项目中使用 NSURLProtocol 拦截 NSURLSession 请求,下面将支持 Post 请求中面临的一个挑战,以及应对策略介绍一下。
6378 0