您的位置:首页 > 移动开发 > Android开发

Android多次认证失败登录锁定功能的实现

2016-10-24 16:02 761 查看
解决的问题:  

    我们在开发Android app的登录功能时,为了加强app的安全性,很有必要实现这样一种功能,即多次登录认证失败,app锁定,直到一定时间之后才能够允许用户重新认证登录。姑且叫它登录锁吧。

      这样的登录锁功能实现基于两个关键点:

      1.System.currentTimeMillis()方法用于获取Java虚拟机的当前运行时刻。

      2.SharedPreferences的使用,用于保存若干次登录失败时的Java虚拟机当前运行时刻。

      下面是核心代码:

package com.example.leidong.timertest;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
//用于显示正确的密码
private TextView textView;
//用于输入用户的密码
private EditText editText;
//跳转按钮,认证成功则完成跳转功能
private Button button;
//3次登录机会
private int LOGIN_CHANCES = 3;
//还剩几次登录机会的标志,初始值就是LOGIN_CHANCES
private int count = LOGIN_CHANCES;
//多次认证失败时需要等待的时间
private float WAIT_TIME = 30000L;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载MainActivity的布局
setContentView(R.layout.activity_main);

//获取组件
init();

//按钮点击事件
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//拿到输入框中的输入内容
String password = editText.getText().toString().trim();

SharedPreferences sp = getSharedPreferences("data", MODE_PRIVATE);

//输入错误时的时间,如果为空的话就取0L
long errorTime = sp.getLong("errorTime", 0L);
//获取当前时间
long recentTime = System.currentTimeMillis();
//如果当前时间与出错时间相差超过30s
if(recentTime - errorTime > WAIT_TIME) {
//认证成功,密码假设就是123456
if (password.equals(textView.getText().toString().trim())) {
//认证成功,跳转到欢迎界面
Intent intent = new Intent(MainActivity.this, OtherActivity.class);
//跳转到OtherActivity
startActivity(intent);
//跳转的同时结束MainActivity
finish();
}
//认证失败
else {
//如果LOGIN_CHANCES次认证全部失败
if(count == 1) {
//清除输入框内容
editText.setText("");
//count值重置
count = LOGIN_CHANCES;
//Toast提醒
Toast.makeText(MainActivity.this, "连续" + LOGIN_CHANCES + "次认证失败,请您" + WAIT_TIME / 1000 +"秒后再登陆!", Toast.LENGTH_LONG).show();
//LOGIN_CHANCES次登录失败时,获取此时的Java虚拟机运行时刻并保存提交
errorTime = System.currentTimeMillis();
SharedPreferences sp1 = getSharedPreferences("data", MODE_PRIVATE);
SharedPreferences.Editor editor = sp1.edit();
editor.putLong("errorTime", errorTime);
editor.commit();
}
//LOGIN_CHANCES次登录机会未用完
else{
//清除输入框内容
editText.setText("");
//剩余次数减1
count--;
//Toast提醒
Toast.makeText(MainActivity.this, "您还有" + count + "次登录机会!", Toast.LENGTH_LONG).show();
}
}
}
//LOGIN_CHANCES次登录机会全部用完,app锁定WAIT_TIME时间,在此期间登录无效,锁定
else{
//Toast提醒
Toast.makeText(MainActivity.this, "登录界面锁定中,请等待!", Toast.LENGTH_LONG).show();
}
}
});
}

/**
* 获取组件
*/
private void init() {
textView = (TextView)findViewById(R.id.textView);
editText = (EditText)findViewById(R.id.editText);
button = (Button)findViewById(R.id.button);
}
}


以上代码含有十分详细的注释,思路很清楚。

运行结果:

1.三次输入故意输入错误密码



2.第3次输入错误密码时



3.在等待期间输入,即使密码正确也不能够登陆,必须等到30s后才能登陆



4.等待时间过后输入正确的密码,成功跳转到欢迎界面



/****************************************************************/

源码地址:
http://download.csdn.net/detail/ldld1717/9662467
/****************************************************************/

      

      
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息