商业级项目登录模块源码分析
2016-04-06 10:44
309 查看
从Git上搞到了一份13年的开源商业级项目源码,经过研究发现里面的代码可读性极高,而且编写规范、用类典雅、逻辑清晰、注释充分,是个可以用来参考学习的好项目。
因此贴出这段验证登录信息并登陆的代码,Review一下:
/*
Task 完成时接收调用方提供的状态信息并以异步方式执行的延续任务。
所以afterTask指的就是接下来的新任务,意思就是该切换页面咯
作者先Syso了一下result,然后以result结果来建立switch/case逻辑,
我们看到,只有当全局变量是Constant.STATAS_OK时,先弹出登陆成功的Toast,然后立刻运行了转换到新页面的逻辑,在这里是转换到MainActivity;
同时我们还要注意,他在开始执行这个intent之前,用putExtra方法携带了一个数据User到下个界面,显然下个页面肯定要重新确认一下这个User值知否完备,
来确保整个登录程序的健壮性
*/
}
接下来是一段MainAcitivty文件的开头部分,我们通过这段代码来验证刚才的分析是否正确
/*
果然出现了一个if逻辑,他用serializable序列化器验证了user,接下来才运行initView()方法,
也就是说如果if语句通不过,整个程序就会报错,多么神奇的排列顺序
*/
分析完毕~
因此贴出这段验证登录信息并登陆的代码,Review一下:
private EditText etAccount;// 帐号 private EditText etPassword;//密码 private CheckBox cbSavedpw;//是否保存密码 //...................中间省略N行......... /** * 执行登录操作 */ private void doLongin() { name = etAccount.getText().toString().trim(); if (name.equals(userFormat)) { name = username; } if (!MatchUtil.isLicitAccount(name)) { if ("".equals(name)) { Toast.makeText(this, R.string.null_account, 0).show(); } else if (name.length() < 3) { Toast.makeText(this, R.string.short_account, 0).show(); } else { Toast.makeText(this, R.string.error_account, 0).show(); } return; } /* 上面这段是登录按钮的执行逻辑,使用了getText().toString().trim()方法获取了一个String字符串, 并且trim()方法自动去除了输入信息两边的空白内容 接下来把登录信息放入if{}逻辑中进行比对,检测了用户名过短或为空值等等的问题 */ // 验证密码 final String loginPasWord = etPassword.getText().toString().trim(); if (!MatchUtil.isLicitPassword(loginPasWord)) { if ("".equals(loginPasWord)) { Toast.makeText(this, R.string.null_password, 0).show(); } else if (loginPasWord.length() < 6) { Toast.makeText(this, R.string.short_password, 0).show(); } else { Toast.makeText(this, R.string.error_password, 0).show(); } return; } //同上一段,这次是验证密码 HttpDatas datas = new HttpDatas(Constant.USERAPI); datas.putParam("method", "login"); datas.putParam("username", name); datas.putParam("pwd",Md5Util.md5Diagest(loginPasWord, 16)); NetUtils.sendRequest(datas, LoginActivity.this, getString(R.string.login_now), new TaskCallBack() { //把账号密码封装到HttpDatas中,此处使用了经典的Md5加密方法,把密码字段加密了 @Override public int excueHttpResponse(String strResponds) { System.out.println(strResponds); int code = 0; JSONObject jsonObject = JSONUtil.instaceJsonObject(strResponds); if (jsonObject != null) { try { code = jsonObject.getInt("code"); } catch (JSONException e1) { e1.printStackTrace(); } } if (code == 2000) { user = JSONUtil.jsonObject2Bean(jsonObject, UserInfo.class); if (cbSavedpw.isChecked()) { SharedPreferences sp = LoginActivity.getOrSharedPrefences(LoginActivity.this); Editor editor = sp.edit(); editor.putBoolean(Constant.ISSAVEPW, true); editor.putString(Constant.USERNAME, name); editor.putString(Constant.PASSWORD, AESUtil.hexEncrypt(loginPasWord, Constant.ENCODEPASSWORD)); editor.commit(); editor.clear(); } return Constant.STATAS_OK; } return code; } /*发送Json请求验证账号密码正确性,中间有一段使用了Editor把账号信息添加进了SharedPreference缓存里, 注意这里十分严谨的用到了AES加密算法,具体方法:<span style="color:#FF0000;">AESUtil.hexEncrypt</span>(参数)*/
@Override public void beforeTask() { } @Override public void afterTask(int result) { System.out.println(result); switch (result) { case Constant.STATAS_OK: Toast.makeText(getApplicationContext(), LoginActivity.this.getString(R.string.login_success), 0).show(); Intent intent = new Intent(LoginActivity.this, MainActivity.class); intent.putExtra("User", user); startActivity(intent); break; // case 5000: // Toast.makeText(getApplicationContext(), // getString(R.string.error_pw_or_user), 0).show(); // break; case 4004: Toast.makeText(getApplicationContext(), getString(R.string.error_pw_or_user), 0).show(); break; default: showResulttoast(result, LoginActivity.this); break; } } <pre name="code" class="java"> });
/*
Task 完成时接收调用方提供的状态信息并以异步方式执行的延续任务。
所以afterTask指的就是接下来的新任务,意思就是该切换页面咯
作者先Syso了一下result,然后以result结果来建立switch/case逻辑,
我们看到,只有当全局变量是Constant.STATAS_OK时,先弹出登陆成功的Toast,然后立刻运行了转换到新页面的逻辑,在这里是转换到MainActivity;
同时我们还要注意,他在开始执行这个intent之前,用putExtra方法携带了一个数据User到下个界面,显然下个页面肯定要重新确认一下这个User值知否完备,
来确保整个登录程序的健壮性
*/
}
接下来是一段MainAcitivty文件的开头部分,我们通过这段代码来验证刚才的分析是否正确
private UserInfo user; public UserInfo getUser() { return user; } public Handler handler = new Handler();
@Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); setContentView(R.layout.activity_main); Intent intent = getIntent(); Serializable serializable = intent.getSerializableExtra("User"); if (serializable != null) { user = (UserInfo) serializable; OrongApplication.user = user; } initView();
/*
果然出现了一个if逻辑,他用serializable序列化器验证了user,接下来才运行initView()方法,
也就是说如果if语句通不过,整个程序就会报错,多么神奇的排列顺序
*/
分析完毕~
相关文章推荐
- Android自定义View — 用Canvas画百分数圆环
- java maven 生成可执行jar
- poll与select
- V-Play入门手册4-如何获取最新的V-Play更新?
- oneapm的技术博客(简书),用来追溯群里的讨论,mark
- 【Android】zxing扫码识别及生成二维码
- MySQL索引原理与慢查询优化
- 自定义菜单与调用接口创建菜单
- [LintCode] 搜索旋转排序数组 Search in Rotated Sorted Array
- Java中的线程(一)
- 找到了与该请求匹配的多个操作
- Leetcode #35. Search Insert Position 搜寻插入位置 解题报告
- 分布式入门之3:副本控制
- Adding the Test API in The ASP.NET Web API Help Page
- 【追求进步】把数组排成最小的数
- java高级之callable与future
- cannot be opened because the project file cannot be parsed
- 里氏替换原则LSP
- cglib与JDK动态代理适用场景
- ubuntu14.04 libgtk-x11-2.0.so.0