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

相关文章
|
1月前
|
JSON JavaScript 中间件
POST 请求如何处理表单数据?
【10月更文挑战第24天】POST请求处理表单数据需要客户端和服务器端的协同工作,客户端负责将表单数据正确地编码并发送给服务器,服务器端则需要准确地接收、验证和处理数据,并向客户端返回合适的响应。
86 1
|
7月前
|
安全 数据处理 C#
C# Post数据或文件到指定的服务器进行接收
C# Post数据或文件到指定的服务器进行接收
|
前端开发
前端提交POST请求却变成GET请求的原因及解决方法
前端提交POST请求却变成GET请求的原因及解决方法
1005 3
|
Web App开发 网络协议 安全
GET和POST方式请求API接口数据返回
GET和POST方式请求API接口数据返回
191 0
|
Java API 数据库
请求地址中主动携带Cookies信息通过登录验证
最近在做一个机关单位的项目,他们的项目基本都是部署在内部网络中,并且都做了单点登录验证,即就是该网站上挂载了许多的系统和应用,访问其中的某一个系统和应用的时候,都会被单点登录拦截在登录页面,必须登录该网站,才能访问其中的系统及应用
131 0
请求地址中主动携带Cookies信息通过登录验证
|
JSON JavaScript 数据格式
封装获取用户 post 提交的数据的方法|学习笔记
快速学习封装获取用户 post 提交的数据的方法
封装获取用户 post 提交的数据的方法|学习笔记
|
JSON 数据格式
axios.post提交的三种请求方式
axios.post提交的三种请求方式
艾伟:彻底解决刷新重复提交问题,你还在用Response.Redirect吗?
以前也研究过,始终没找到好的办法,看了微软Msdn上的解决方案,使用后发现存在较多漏洞,考虑的情况太少,如页面加载后没有提交,始终刷新,在同一浏览器打开多个各选项卡,每个选项卡打开同一页面或不同页面,以下是我的解决方案, Codepublic class RefreshServe : System.
896 0
|
Web App开发 程序员
使用ApiPost模拟发送get、post、delete、put等http请求
现在的模拟发送请求插件很多比如老外的postman等,但亲测咱们国内的 ApiPost 更好用一些,今天来分享如何使用ApiPost发送各种请求。