最近做了一个Android+MyEclipse+Mysql基于SSM框架的用户登录、注册(MD5加密算法)+找回密码功能的实现。具体实现过程如下:
1.Mysql
- 用户表(User表)
2.Android端
绿色的框可以忽略
public class Login extends AppCompatActivity {
private EditText nameEdit, passwordEdit;
private Button login;
private Button create, Repass;
private CheckBox CK_save, CK_auto;
public UserInfo userInfo;
private String username;
private String password;
private SharedPreferences sp;
private SharedPreferences.Editor editor;
private static final String USER_NAME = "user_name";
private static final String PASSWORD = "password";
private static final String ISSAVEPASS = "savePassWord";
private static final String AUTOLOGIN = "autoLogin";
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
context = getApplicationContext();
sp = getSharedPreferences("userInfo", MODE_PRIVATE);
editor = sp.edit();//获取编辑者
nameEdit = (EditText) findViewById(R.id.nameEdit);
passwordEdit = (EditText) findViewById(R.id.passwordEdit);
login = (Button) findViewById(R.id.login);
userInfo = new UserInfo(this);
create = (Button) findViewById(R.id.createUser);
Repass = (Button) findViewById(R.id.btnRepass);
CK_save = (CheckBox) findViewById(R.id.savePassword);
CK_auto = (CheckBox) findViewById(R.id.autoLogin);
// 判断是否记住了密码的 初始默认是要记住密码的
if (userInfo.getBooleanInfo(ISSAVEPASS)) {
CK_save.setChecked(true);
nameEdit.setText(userInfo.getStringInfo(USER_NAME));
passwordEdit.setText(userInfo.getStringInfo(PASSWORD));
// 判断是否要自动登陆
if (userInfo.getBooleanInfo(AUTOLOGIN)) {
// 默认是要自动登陆的
CK_auto.setChecked(true);
final Intent i = new Intent();
i.setClass(Login.this, MainActivity.class);
// startActivity(i);
Timer timer = new Timer();
TimerTask tast = new TimerTask() {
@Override
public void run() {
startActivity(i);
}
};
timer.schedule(tast, 1500);
this.finish();
}
}
//用户注册
create.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 页面跳转操作
Intent intent = new Intent(Login.this, CreateUserActivity.class);//后面改成注册acitivity
startActivity(intent);
}
});
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (nameEdit.getText().toString().trim().equals("") | passwordEdit.getText().
toString().trim().equals("")) {
Toast.makeText(Login.this, "请输入账号或者注册账号!", Toast.LENGTH_SHORT).show();
} else {
new Thread(new Runnable() {
@Override
public void run() {
String url = "http://10.0.2.2:8080/TOF_login/LoginUser";
Map params = new HashMap();
String name = nameEdit.getText().toString();
String password = passwordEdit.getText().toString();
params.put("U_phone", name);
params.put("U_pass", password);
String result = HttpUtilConnection.getContextByHttp(url, params);
Log.i("===========", result.toString());
Message msg = new Message();
msg.what = 0x12;
Bundle data = new Bundle();
data.putString("result", result);
Log.i("*********************", result.toString());
msg.setData(data);
hander.sendMessage(msg);
}
Handler hander = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0x12) {
Bundle data = msg.getData();
String key = data.getString("result");//得到json返回的json
if (key != null && key.startsWith("\ufeff")) {
key = key.substring(1);
}
try {
JSONObject json = new JSONObject(key);
String result = (String) json.get("result");
if ("success".equals(result)) {
//返回成功后 判断是否勾选自动登陆和记住密码 写入文件
username = nameEdit.getText().toString();
password = passwordEdit.getText().toString();
editor.putString("ID", username);//保存用户名
editor.commit();
if (CK_save.isChecked()) {
editor.putString("name", username);
editor.putString("password", password);
userInfo.setUserInfo(ISSAVEPASS, true);
editor.commit();
}
if (CK_auto.isChecked()) {
userInfo.setUserInfo(AUTOLOGIN, true);
}
//页面跳转
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("U_phone", nameEdit.getText().toString());
intent.putExtras(bundle);
intent.setClass(context, MainActivity.class);//跳转到新闻主界面
startActivity(intent);
Toast.makeText(Login.this, "登录成功", Toast.LENGTH_SHORT).show();
} else if ("passError".equals(result)) {
Toast.makeText(Login.this, "登录失败,密码错误", Toast.LENGTH_SHORT).show();
passwordEdit.setText("");
}
else if ("noUser".equals(result)) {
Toast.makeText(Login.this, "登录失败,用户不存在,请注册", Toast.LENGTH_SHORT).show();
passwordEdit.setText("");
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
};
}).start();
}
}
});
}
//用户忘记密码
public void Repass(View view) {
Intent intent = new Intent(Login.this, RepassActivity.class);
startActivity(intent);
}
}
CreateUserActivity
用户输入用户名(手机号),点击获取验证码,输入密码,点击确定。把用户名和密码封装为Json格式发送到服务器进行判断及处理,若数据库中没有该用户则在数据库中插入一条记录,反之则注册用户失败。服务器端在返回一个结果,对返回的结果进行分开处理即可。
package com.example.myapplication;
public class CreateUserActivity extends AppCompatActivity {
private String N_name;
private String N_pass;
private String N_repass;
private String yan,ma;
private EditText edit_register, edit_setpassword, edit_resetpassword, edit_yan, edit_ma;
private Button btn_yes, btn_cancel;
private int userflag = 1,phoneflag = 1;
private static Context context;
public static final String PHONE = "^(((13|18)[0-9]{9})|(15[012356789][0-9]{8})|((147|170|171|173|175|176|177|178)[0-9]{8}))$";
private String result;
private String strUrl ="http://10.0.2.2:8080/TOF_login/InsertCustom";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_user);
context = getApplicationContext();//获取context
edit_ma = (EditText) findViewById(R.id.edit_ma);
init();
Yan();
}
private void init() {
edit_register = (EditText) findViewById(R.id.edit_register);
edit_setpassword = (EditText) findViewById(R.id.edit_setpassword);
edit_resetpassword = (EditText)findViewById(R.id.edit_resetpassword);
edit_yan = (EditText) findViewById(R.id.edit_yan);
}
/**
* 校验手机号码
* @param mobile
* @return
* @author lqyao
*/
public static final boolean isMoblie(String mobile){
boolean flag = false;
if (null != mobile && !mobile.trim().equals("") && mobile.trim().length() == 11) {
Pattern pattern = Pattern.compile(PHONE);
Matcher matcher = pattern.matcher(mobile.trim());
flag = matcher.matches();
}
return flag;
}
//获取验证码
public String Yan(){
edit_ma.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Random random = new Random();
Set set = new HashSet<>();
while (set.size() < 4)
{
int randomInt = random.nextInt(10);
set.add(randomInt);
}
StringBuffer sb = new StringBuffer();
for (Integer i : set)
{
sb.append("" + i);
}
edit_ma.setText(sb.toString());
}
});
ma = edit_ma.getText().toString().trim();
return ma;
}
/*点击按钮创建用户*/
public void Create(View view) {
N_name = edit_register.getText().toString().trim();
N_pass = edit_setpassword.getText().toString().trim();
N_repass = edit_resetpassword.getText().toString().trim();
yan = edit_yan.getText().toString().trim();
ma = edit_ma.getText().toString().trim();
/*判断是否输入*/
if((N_name.isEmpty())||(N_pass.isEmpty())||(N_repass.isEmpty()) ||(yan.isEmpty())){
userflag = 0;
Toast.makeText(this, "不能为空,请重新输入", Toast.LENGTH_SHORT).show();
}else{
//判断手机号是否符合条件 11位等等
if(N_name.length()!=11){
userflag = 0;
Toast.makeText(this, "手机号必须为11位,请重新输入", Toast.LENGTH_SHORT).show();
}
if(N_name.length()==11){
//不符合手机号的正则表达式
if (!isMoblie(N_name)){
userflag = 0;
Toast.makeText(this, "手机号不正确,请重新输入", Toast.LENGTH_SHORT).show();
}
//判断两次密码是否一致
else if(!(N_repass.equals(N_pass))){
userflag=0;
Toast.makeText(this, "两次密码不一样,请重新输入", Toast.LENGTH_SHORT).show();
}
//判断验证码是否正确
else if(!(yan.equals(ma))){
userflag=0;
Toast.makeText(this, "验证码不一样,请重新输入", Toast.LENGTH_SHORT).show();
}
}
}
/*条件满足*/
if (userflag ==1){
/*上传服务器存入数据库*/ //查询一下,是否用户名重复
final Map params = new HashMap();
params.put("U_phone", N_name);
params.put("U_pass", N_pass);
Log.i("000000000000000000","-----------");
new Thread(new Runnable() {
@Override
public void run() {
//1、网络访问
try {
result = HttpUtilConnection.getContextByHttp(strUrl, params);
Log.i("000000000000000000",result.toString().trim());
}catch (Exception e){
e.printStackTrace();
result = "网络请求失败,请稍后再试。";
}
//2、UI线程显示服务器的响应结果
Message msg = new Message();
msg.what = 0x12;
Bundle data = new Bundle();
data.putString("result", result);
msg.setData(data);
handler.sendMessage(msg);
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what == 0x12) {
Bundle data = msg.getData();
String key = data.getString("result");//得到json返回的json
if (key.startsWith("\ufeff")) {
key = key.substring(1);
}
Toast.makeText(context, key, Toast.LENGTH_LONG).show();
try {
JSONObject json = new JSONObject(key);
String result = (String) json.get("result");
if ("error".equals(result)){//重名
Toast.makeText(CreateUserActivity.this, "该手机号已注册!请登录", Toast.LENGTH_SHORT).show();
}
else{
if ("success".equals(result)) {//创建成功
Toast.makeText(CreateUserActivity.this, "创建用户成功!", Toast.LENGTH_SHORT).show();
/*暂停1.5秒后跳转到登录界面*/
final Intent localIntent = new Intent(context, Login.class);
Timer timer = new Timer();
TimerTask tast = new TimerTask() {
@Override
public void run() {
startActivity(localIntent);
}
};
timer.schedule(tast, 1500);
}
else if ("error".equals(result)){
Toast.makeText(CreateUserActivity.this, "创建用户失败!", Toast.LENGTH_SHORT).show();
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
};
}).start();
}
}
public void btn_cancle(){
Intent login_intent = new Intent(CreateUserActivity.this, Login.class);
startActivity(login_intent);
}
/*onResume
从Aactivity跳到Bactivity。由于Bactivity的操作,影响了Aactivity的数据,所以再回到A的时候,需要A能够进行刷新操作。
但是默认跳回去的时候,A界面还是上次那个。*/
protected void onResume() {
super.onResume();
}
}
RepassActivity
public class RepassActivity extends AppCompatActivity {
private String N_name;
private String N_pass;
private String N_repass;
private String yan,ma;
private EditText edit_register, edit_setpassword, edit_resetpassword, edit_yan, edit_ma;
private Button btn_yes, btn_cancel;
private int userflag = 1,phoneflag = 1;
private static Context context;
public static final String PHONE = "^(((13|18)[0-9]{9})|(15[012356789][0-9]{8})|((147|170|171|173|175|176|177|178)[0-9]{8}))$";
private String result;
private String strUrl ="http://10.0.2.2:8080/TOF_login/RepassCustom";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_repass);
context = getApplicationContext();//获取context
edit_ma = (EditText) findViewById(R.id.edit_ma);
init();
Yan();
}
private void init() {
edit_register = (EditText) findViewById(R.id.edit_register);
edit_setpassword = (EditText) findViewById(R.id.edit_setpassword);
edit_resetpassword = (EditText)findViewById(R.id.edit_resetpassword);
edit_yan = (EditText) findViewById(R.id.edit_yan);
}
/**
* 校验手机号码
* @param mobile
* @return
* @author lqyao
*/
public static final boolean isMoblie(String mobile){
boolean flag = false;
if (null != mobile && !mobile.trim().equals("") && mobile.trim().length() == 11) {
Pattern pattern = Pattern.compile(PHONE);
Matcher matcher = pattern.matcher(mobile.trim());
flag = matcher.matches();
}
return flag;
}
//获取验证码
public String Yan(){
edit_ma.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Random random = new Random();
Set set = new HashSet<>();
while (set.size() < 4)
{
int randomInt = random.nextInt(10);
set.add(randomInt);
}
StringBuffer sb = new StringBuffer();
for (Integer i : set)
{
sb.append("" + i);
}
edit_ma.setText(sb.toString());
}
});
ma = edit_ma.getText().toString().trim();
return ma;
}
/*点击按钮找回密码*/
public void Create(View view) {
N_name = edit_register.getText().toString().trim();
N_pass = edit_setpassword.getText().toString().trim();
N_repass = edit_resetpassword.getText().toString().trim();
yan = edit_yan.getText().toString().trim();
ma = edit_ma.getText().toString().trim();
/*判断是否输入*/
if((N_name.isEmpty())||(N_pass.isEmpty())||(N_repass.isEmpty()) ||(yan.isEmpty())){
userflag = 0;
Toast.makeText(this, "不能为空,请重新输入", Toast.LENGTH_SHORT).show();
}else{
//判断手机号是否符合条件 11位等等
if(N_name.length()!=11){
userflag = 0;
Toast.makeText(this, "手机号必须为11位,请重新输入", Toast.LENGTH_SHORT).show();
}
if(N_name.length()==11){
//不符合手机号的正则表达式
if (!isMoblie(N_name)){
userflag = 0;
Toast.makeText(this, "手机号不正确,请重新输入", Toast.LENGTH_SHORT).show();
}
//判断两次密码是否一致
else if(!(N_repass.equals(N_pass))){
userflag=0;
Toast.makeText(this, "两次密码不一样,请重新输入", Toast.LENGTH_SHORT).show();
}
//判断验证码是否正确
else if(!(yan.equals(ma))){
userflag=0;
Toast.makeText(this, "验证码不一样,请重新输入", Toast.LENGTH_SHORT).show();
}
}
}
/*条件满足*/
if (userflag ==1){
/*上传服务器存入数据库*/ //查询一下,是否用户名重复
final Map params = new HashMap();
params.put("U_phone", N_name);
params.put("U_pass", N_pass);
Log.i("000000000000000000","-----------");
new Thread(new Runnable() {
@Override
public void run() {
//1、网络访问
try {
result = HttpUtilConnection.getContextByHttp(strUrl, params);
Log.i("000000000000000000",result.toString().trim());
}catch (Exception e){
e.printStackTrace();
result = "网络请求失败,请稍后再试。";
}
//2、UI线程显示服务器的响应结果
Message msg = new Message();
msg.what = 0x12;
Bundle data = new Bundle();
data.putString("result", result);
msg.setData(data);
handler.sendMessage(msg);
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what == 0x12) {
Bundle data = msg.getData();
String key = data.getString("result");//得到json返回的json
if (key.startsWith("\ufeff")) {
key = key.substring(1);
}
Toast.makeText(context, key, Toast.LENGTH_LONG).show();
try {
JSONObject json = new JSONObject(key);
String result = (String) json.get("result");
if ("error".equals(result)){//重名
Toast.makeText(RepassActivity.this, "该手机号未注册!请注册!", Toast.LENGTH_SHORT).show();
}
else{
if ("success".equals(result)) {//创建成功
Toast.makeText(RepassActivity.this, "找回密码成功!", Toast.LENGTH_SHORT).show();
/*暂停1.5秒后跳转到登录界面*/
final Intent localIntent = new Intent(context, Login.class);
Timer timer = new Timer();
TimerTask tast = new TimerTask() {
@Override
public void run() {
startActivity(localIntent);
}
};
timer.schedule(tast, 1500);
}
else if ("error".equals(result)){
Toast.makeText(RepassActivity.this, "找回密码失败!", Toast.LENGTH_SHORT).show();
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
};
}).start();
}
}
public void btn_cancle(){
Intent login_intent = new Intent(RepassActivity.this, Login.class);
startActivity(login_intent);
}
/*onResume
从Aactivity跳到Bactivity。由于Bactivity的操作,影响了Aactivity的数据,所以再回到A的时候,需要A能够进行刷新操作。
但是默认跳回去的时候,A界面还是上次那个。*/
protected void onResume() {
super.onResume();
}
}
UserInfo
用于用户勾选记住密码或自动登录时临时存储用户的账号及密码的userInfo 文件。
package com.example.myapplication;
import android.content.Context;
import android.content.SharedPreferences;
public class UserInfo {
private String USER_INFO = "userInfo";
private Context context;
public UserInfo() {
}
public UserInfo(Context context) {
this.context = context;
}
// 存放字符串型的值
public void setUserInfo(String key, String value) {
SharedPreferences sp = context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.remove(key);
editor.putString(key, value);
editor.commit();
}
// 存放整形的值
public void setUserInfo(String key, int value) {
SharedPreferences sp = context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.remove(key);
editor.putInt(key, value);
editor.commit();
}
// 存放长整形值
public void setUserInfo(String key, Long value) {
SharedPreferences sp = context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.remove(key);
editor.putLong(key, value);
editor.commit();
}
// 存放布尔型值
public void setUserInfo(String key, Boolean value) {
SharedPreferences sp = context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.remove(key);
editor.putBoolean(key, value);
editor.commit();
}
// 清空记录
public void clear() {
SharedPreferences sp = context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.clear();
editor.commit();
}
// 获得用户信息中某项字符串型的值
public String getStringInfo(String key) {
SharedPreferences sp = context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
return sp.getString(key, "");
}
// 获得用户息中某项整形参数的值
public int getIntInfo(String key) {
SharedPreferences sp = context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
return sp.getInt(key, -1);
}
// 获得用户信息中某项长整形参数的值
public Long getLongInfo(String key) {
SharedPreferences sp = context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
return sp.getLong(key, -1);
}
// 获得用户信息中某项布尔型参数的值
public boolean getBooleanInfo(String key) {
SharedPreferences sp = context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
return sp.getBoolean(key, false);
}
}
HttpUtilConnection
package com.example.myapplication.ustils;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;
/**
* Created by Administrator on 2019/4/13 0013.
*/
public class HttpUtilConnection {
public static String BASE_URL= "http://10.0.2.2:8080/TOF_login/LoginUser";
/*
* urlStr:网址
* parms:提交数据
* return:网页源码
* */
public static String getContextByHttp(String urlStr,Map parms){
StringBuilder sb = new StringBuilder();
try{
URL url = new URL(urlStr);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setInstanceFollowRedirects(true);
OutputStream outputStream = connection.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream,"UTF-8"));
writer.write(getStringFromOutput(parms));
writer.flush();
writer.close();
outputStream.close();
if(connection.getResponseCode() == HttpURLConnection.HTTP_OK){
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String temp;
while((temp = reader.readLine()) != null){
sb.append(temp);
}
reader.close();
}else{
return "connection error:" + connection.getResponseCode();
}
connection.disconnect();
}catch (Exception e){
return e.toString();
}
return sb.toString();
}
/**
* 将map转换成key1=value1&key2=value2的形式
* @param map
* @return
* @throws UnsupportedEncodingException
*/
private static String getStringFromOutput(Map map) throws UnsupportedEncodingException {
StringBuilder sb = new StringBuilder();
boolean isFirst = true;
for(Map.Entry entry:map.entrySet()){
if(isFirst)
isFirst = false;
else
sb.append("&");
sb.append(URLEncoder.encode(entry.getKey(),"utf-8"));
sb.append("=");
sb.append(URLEncoder.encode(entry.getValue(),"utf-8"));
}
return sb.toString();
}
}
activity_create_user.xml
activity_login.xml
activity_repass.xml
创建一个空的MainActivity,当用户名密码正确时跳转到空的MainActivity界面
MainActivity
package com.example.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
activity_main.xml
配置AndroidManifest.xml,给网络通讯的权限
AndroidManifest.xml
2、MySQL(基本的一些SQL 语句,建立数据库和用户表,并向用户表中插入数据)
drop database if exists tof02;//如果存在数据库tof02,则删除数据库tof02
Create database tof02;//创建数据库tof02
use tof02;//使用tof02 数据库,之后就是对此数据库进行操作
drop table if exists User;
create table User
(
U_id varchar(20) not null,
A_id varchar(20),
U_name varchar(20),
U_nickname varchar(20),
U_pass varchar(20),
U_sex varchar(5),
U_phone char(11),
U_status varchar(11),
U_balance float,
U_address varchar(100),
U_Redate varchar(100),
primary key (U_id)
);
-- //用户信息的插入
insert into user values('20150101000','A000','水盆','shui','123','男','13502249856','启用',100,'北京市朝阳区XXXXX','2019-06-24');
insert into user values('20150101001','A000','水桶','shuitong','123','女','15302249856','启用',10000,'北京市昌平区','2019-06-24');
insert into user values('20150101002','A000','水杯','shuibei','123','男','13502249885','禁用',100,'北京市朝阳区XXXXX','2019-06-28');
insert into user values('20150101003','A000','水手','shuishou','123','女','15302247653','禁用',10000,'北京市昌平区','2019-06-29');
select * from user;
3、Myeclipse 服务器端
代码整个太长了,完整的项目放到压缩文件中,请下载,不懂留言,看到会回复。
百度网盘
链接:https://pan.baidu.com/s/1CvqptfRpafI_8YlKpFEHqw
提取码:nrai