关闭

OSChina_IOS版客户端笔记(五)_账号登录验证以及账号加密保存

标签: OSChna账号登录AES加密ASIHTTPRequest
1292人阅读 评论(0) 收藏 举报
分类:

OSChina中账号登录用的是ASIHTTPRequest,而不是后面使用的AFNetworking。关于为什么不使用同一个类库,我网上查了下(原文地址:http://www.infoq.com/cn/articles/afn_vs_asi)

AFN适合逻辑简单的应用,或者更适合开发资源尚不丰富的团队,因为AFN的易用性要比ASI好很多,而这样的应用(或团队)对底层网络控件的定制化要求也非常低。ASI更适合已经发展了一段时间的应用,或者开发资源相对丰富的团队,因为往往这些团队(或他们的应用)已经积累了一定的经验,无论是产品上还是技术上的。需求复杂度就是在这种时候高起来,而且底层订制的需求也越来越多,此时AFN就很难满足需求,需要牺牲一定的易用性,使用ASI作为网络底层控件。SegmentFault开源客户端现在被设计为一款简单的阅读客户端,几乎没有定制要求,因此,目前我选择了AFN作为网络控件。

先不管ASI和AFN的的区别了,现在先来看看我们怎么验证账号吧,这里新建一个项目LoginVerify。新建一个LoginViewController,有:

#import "LoginViewController.h"
#import "ASIHTTPRequest.h"
#import "ApiError.h"

#import "Tool.h"
#import "NewsTableController.h"
@interface LoginViewController ()

@end

@implementation LoginViewController
@synthesize userName;
@synthesize passWord;
@synthesize loginBtn;

NSString *name,*pwd;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [loginBtn addTarget:self action:@selector(login) forControlEvents:UIControlEventTouchUpInside];
}

-(void)login {
    name = self.userName.text;
    pwd = self.passWord.text;
    //判断用户名、密码是否为空
    if([name length] == 0 ||
       [pwd length] == 0) {
        UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"提示" message:@"密码或用户名不能为空" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
        [alertView show];
    } else {
        //1.提交数据到服务器
        request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"https://www.oschina.net/action/api/login_validate"]];
        [request setUseCookiePersistence:YES];
        [request setPostValue:name forKey:@"username"];
        [request setPostValue:pwd forKey:@"pwd"];
        [request setPostValue:@"1" forKey:@"keep_login"];
        [request setDelegate:self];
        [request setDidFailSelector:@selector(requestFailed:)];
        [request setDidFinishSelector:@selector(requestLogin:)];
        [request startAsynchronous];

    }
}

- (void)requestFailed:(ASIHTTPRequest *)request{     NSLog(@"登录验证失败");
}

- (void)requestLogin:(ASIHTTPRequest *)request{ //登录验证成功
    ApiError *error = [Tool getApiError2:request.responseString];
    //根据ApiError来决定处理流程
    switch (error.errorCode) {
            
        case 1: //用户名、密码正确
        {
            //持久化用户名、密码
            [[[Tool alloc]init]saveUserNameAndPwd:name andPwd:pwd];
            //跳转界面
            NewsTableController *newsTableController = [[NewsTableController alloc]initWithNibName:@"NewsTableController" bundle:nil];
            [self presentViewController:newsTableController animated:YES completion:nil];
            break;
        }
            
        case 0: //提示错误信息
        case -1:
        {
            UIAlertView *alertView =
            [[UIAlertView alloc]initWithTitle:@"错误" message:error.errorMessage delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
            [alertView show];
            break;
        }
    }
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

以上代码的逻辑应该算是简单的,将用户名、密码作为ASIFromDataRequest:requestWithURL方法的参数,想服务器发送请求。服务器会返回一个ASIHTTPRequest对象,这个ASIHTTPRequest对象会包含与登录相关的xml数据。解析它,然后根据解析得到的信息,决定是提示异常还是跳转界面。

除此之外,还需要注意账号信息的安全,如果使用UserDefault对账号信息进行保存,则需要对数据进行加密处理。这里使用AES算法加密

程序运行效果:




上面的工程项目只是简单的从OSChina中抽取代码,导入了AES加密、XML解析部分代码。本来想写一个评论列表的,后来发现如果添加这个评论列表的话,设计到的东西太多了。只怕会弄得很乱,就作罢了,,就先这样吧。

工程地址:http://download.csdn.net/detail/u011638883/6644339

O啦~~~

转载请保留出处:http://blog.csdn.net/u011638883/article/details/17068801

谢谢!!


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:169886次
    • 积分:2959
    • 等级:
    • 排名:第12336名
    • 原创:107篇
    • 转载:9篇
    • 译文:5篇
    • 评论:137条
    最新评论