作为一名程序员,应该懂得分享
工作中项目Login分为联网登陆和离线登陆两种方式,这种模块估计以后还会用到,特意从项目中抽取出来(部分模块,根据以后具体需求填写就行),仅供参考。
第一次登陆必须联网,访问服务器获得响应,验证用户名和密码是否正确,此外还从服务器获得一个经过Md5加密后的password密文。登陆成功后将用户名和服务器返回的password密文通过SharedPreferences 保存,注意此处保存的是加密后密文,因为直接保存密码是不安全,SharedPreferences 本质上就是一个xml文件以键值对的形式存储在Sdcard上,只有稍微懂点android的人导出这个文件那么密码就轻易泄露了。 离线登陆是,在没有网络的情况下,根据用户输入的用户名密码(经过Md5加密后的密文)和SharedPreferences 中的用户名,密文进行字符串比较,相同则跳转到主页面,否则弹出错误提示。
package com.example.login;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button btnLogin;
private Context context;
private EditText etCorpName;
private EditText etUserName;
private EditText etPassWord;
private String corpName;
private String userName;
private String pwd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViews();
}
private void findViews() {
context = MainActivity.this;
btnLogin = (Button) findViewById(R.id.buttonLogin);
etCorpName = (EditText) findViewById(R.id.editTextCorpName);
etUserName = (EditText) findViewById(R.id.editTextUserName);
etPassWord = (EditText) findViewById(R.id.editTextPassWord);
// 点击登录
btnLogin.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 如果用户名密码为空 则弹出提示
if (isCheckNull()) {
Toast.makeText(context, "用户名密码不能为空 ", Toast.LENGTH_SHORT)
.show();
return;
}
if (IsHaveInternet(context)) {
// TODO 联网登陆 异步操作
// 开启线程,通过post方式将将用户名密码为提交到服务器,将获得结果在Handler中处理
// 登陆成功,保存用户名,密码密文到SharedPreferences
login();
// saveInfo(); //保存信息这一步应该在Handler中完成
} else {
// 离线登陆
localLogin();
}
}
});
}
/**
* 联网登陆
*/
private void login() {
}
/**
* 登陆成功,保存登陆信息
*/
private void saveInfo() {
// TODO
}
/**
* 离线登陆
*/
private void localLogin() {
SharedPreferences spf = context.getSharedPreferences("loginInfo",
MODE_PRIVATE);
String spsCorpName = spf.getString("corpName", "");
String spsName = spf.getString("username", "");
String spsPwd = spf.getString("pwd", "");
if (TextUtils.isEmpty(spsCorpName) && TextUtils.isEmpty(spsName)
&& TextUtils.isEmpty(spsPwd)) {
// SharedPreferences中数据为空:首次登陆,必须访问网络
Toast.makeText(context, "首次登陆,必须访问网络 ", Toast.LENGTH_SHORT).show();
return;
}
if (spsCorpName.equals(corpName) && spsName.equals(spsName)
&& spsPwd.equals(pwd)) {
// 密码校验正确,跳转到主页面
Intent intent = new Intent(this, MenuActivity.class);
startActivity(intent);
} else {
Toast.makeText(context, "用户名密码错误 ", Toast.LENGTH_SHORT).show();
}
}
/**
* 提交空校验
*
* @return
*/
private Boolean isCheckNull() {
corpName = etCorpName.getText().toString();
userName = etUserName.getText().toString();
pwd = etPassWord.getText().toString();
return !(TextUtils.isEmpty(corpName) || TextUtils.isEmpty(userName)
|| TextUtils.isEmpty(corpName) || TextUtils.isEmpty(pwd));
}
/**
* 是否联网网络
*
* @param context
* @return
*/
public boolean IsHaveInternet(Context context) {
try {
ConnectivityManager manger = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manger.getActiveNetworkInfo();
return (info != null && info.isConnected());
} catch (Exception e) {
return false;
}
}
}
MD5加密的工具类,Md5加密是一种单向不可逆的加密
/**
* Md5加密工具
*
* @param s
* @return
*/
public static String md5One(String s) {
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e.getMessage());
}
md.update(s.getBytes());
// 之前的登陆密码
// return byteArrayToHexString(md.digest());
return byteArrayToHexString(md.digest()).toUpperCase();
}
大小写转换
public static String byteArrayToHexString(byte[] b) {
String result = "";
for (int i = 0; i < b.length; i++) {
result = result + byteToHexString(b[i]);
}
return result;
}