Android本地验证码的简易实现方法(防止暴力登录)

0.  前言 

验证码无处不在,有人问我,你知道达芬奇密码下面是什么吗,对,答案就是达芬奇验证码。

验证码一个最主要的作用就是防止恶意暴力破解登录,防止不间断的登录尝试,有人说其实可以在服务器端对该终端进行登录间隔检测,如果间隔太短可以展示拒绝的姿态。但是还是本地验证码作用更加实在,可以减轻服务器端的压力。这篇将使用自定义View来实现一个如下效果的简易本地验证码。算是对自定义View知识的复习吧。

1.  布局结构 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:myattribute="http://schemas.android.com/apk/res-auto"
 android:layout_width="match_parent"
 android:layout_height="match_parent" >
 <com.calvin.verification_code.MyView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerInParent="true"
  android:padding="10dp"
  myattribute:text="0 0 0 0 "
  myattribute:textcolor="#000"
  myattribute:textsize="40sp"
  android:id="@+id/myView" />
 <EditText
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:inputType="number"
  android:hint="刷新后输入"
  android:layout_below="@+id/myView"
  android:layout_centerHorizontal="true"
  android:layout_marginTop="20dp"
  android:id="@+id/editText" />
 <Button
  android:text="确认"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_alignBottom="@+id/editText"
  android:layout_alignParentEnd="true"
  android:layout_marginEnd="10dp"
  android:id="@+id/button" />
</RelativeLayout> 

在自定义控件MyView中使用了自定义属性,面试的时候偶尔也会被问到,其实并不难。这里使用文字内容、颜色和字号三个自定义属性。命名空间别忘了加。

自定义属性声明只需要在values目录下声明一个xml文件即可。文件名字不重要,重要的是这个name属性,因为我们会在自定义控件类中通过R.styleable.MyView来找到这个自定义属性声明信息。

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <declare-styleable name="MyView">
  <attr name="text" format="string"/>
  <attr name="textcolor" format="color"/>
  <attr name="textsize" format="dimension"/>
 </declare-styleable>
</resources> 

2.  自定义View类

看一下这个类的构造函数:

public MyView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyView);
  for (int i = 0; i < a.getIndexCount(); i++) {
   int attr = a.getIndex(i);
   switch (attr) {
    case R.styleable.MyView_text:
     mText = a.getString(attr);
     break;
    case R.styleable.MyView_textcolor:
     //二参为默认颜色
     mTextColor = a.getColor(attr, Color.BLACK);
     break;
    case R.styleable.MyView_textsize:
     // 默认字体大小为16sp,TypeValue把sp转化为px
     mTextSize = a.getDimensionPixelSize(attr,
       (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
         16, getResources().getDisplayMetrics()));
     break;
   }
  }
  a.recycle();
  mPaint = new Paint();
  mPaint.setTextSize(mTextSize);
  mBound = new Rect();
  //获得绘制文本的宽和高
  mPaint.getTextBounds(mText, 0, mText.length(), mBound);
  this.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    //生成一个随机的四位数字,并发送一个自定义广播
    mText = randomText();
    postInvalidate();
   }
  });
 } 

核心代码就是解析自定义属性,并初始化一个画笔,并把解析出来的字体大小设置给画笔,设计点击时间,使其被点击后重新随机产生四位数字验证码,并使用postInvalidate()刷新界面。最后使用mBound记录这个四位数文本的宽高。

2.  自定义View类中的其他细节

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  int width = 0;
  int height = 0;
  int specMode = MeasureSpec.getMode(widthMeasureSpec);
  int specSize = MeasureSpec.getSize(widthMeasureSpec);
  switch (specMode) {
   case MeasureSpec.EXACTLY:
    width = getPaddingLeft() + getPaddingRight() + specSize;
    break;
   case MeasureSpec.AT_MOST:
    width = getPaddingLeft() + getPaddingRight() + mBound.width();
    break;
  }
  //同样逻辑处理高
  setMeasuredDimension(width, height);
}
 @Override
 protected void onDraw(Canvas canvas) {
  mPaint.setColor(Color.YELLOW);
  canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint);
  mPaint.setColor(mTextColor);
  canvas.drawText(mText, getWidth() / 2 - mBound.width() / 2, getHeight() / 2 + mBound.height() / 2, mPaint);
  Random random = new Random();
  for(int i = 0; i <= 3; i++){
   int temp = random.nextInt(colors.length);
   mPaint.setColor(colors[temp]);
   mPaint.setStrokeWidth(3);
   canvas.drawLine(randomStartWidth(),randomStartHeight(),randomEndWidth(),randomEndHeight(),mPaint);
  }
 } 

其实主要还是measure和draw的过程了。

在onMeasure()方法中最重要的逻辑应该就是处理MeasureSpec.AT_MOST的这种情况了,这时候前面的mBound.width()就起作用了。还有就是不管何种测量模式,都手动处理了padding的情况。

onDraw()方法中首先绘制了一个黄色矩形作为自定义View的背景,接着根据自定义属性中的文字内容和颜色绘制四位数字,最后绘制四条噪声直线,颜色随机,并且起始位置和结束位置也是随机产生的。

3.  实时改变维护的正确验证码

为了验证用户输入的验证码的正确性,需要在MainActivity中维护一个变量,在用户点击自定义View刷新验证码时,能够实时改变这个变量的值。这里使用自定义广播实现,在生成一个随机的四位数字,发送一个自定义广播。

Intent intent = new Intent();
intent.setAction("com.seu_calvin.update");
intent.putExtra("data", sb.toString());
getContext().sendBroadcast(intent); 

接着在MainActivity注册一个广播接收者即可取得此时的验证码信息,在用户点击确定按钮后在拿到EditText中的值与其进行对比即可。这个逻辑还是比较简单的。

以上所述是小编给大家介绍的Android本地验证码的简易实现方法(防止暴力登录),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android获取和读取短信验证码的实现方法

    现如今,验证码在Android的客户端还是非常普遍的.通过手机账号和验证码直接去注册应用账户的信息.很多应用都以这种方式来完成注册.简单的介绍一下吧. Android获取短信验证码还是比较简单的,通过Mob官网提供的ShareSDK,调用其中内部的方法,就可以获取到短信的验证码了.提供一下Mob的官网地址.http://www.mob.com/#/在官网上注册相关的信息之后,下载相关的jar包和.so文件就可以实现获取短信验证码了(2.0之前的版本都需要下载jar包和 .so文件,而现在的2.2

  • Android实现自动提取短信验证码功能

    本文实例讲解了Android自动提取短信验证码解决方案,分享给大家供大家参考,具体内容如下 主要功能及优点 1.收到验证码短信后,自动提取短信中的验证码填写到相应输入框 2.可指定一个号码,只读取与他有关短信,避免提取来源错误 3.利用正则表达式,可匹配各种类型验证码 模块集成关键步骤     将auto_getcode_demo中src包里的SMSContentObserver类复制到你的项目src包中 在SMSContentObserver中:    修改正则表达式内容来匹配自己想要获取的字

  • Android实现短信验证码自动填写功能

    本实例为大家分享了Android实现短信验证码自动填写功能,供大家参考,具体内容如下 实现思路很简单: 1.在需要输入验证码的Activity代码注册监听短信的广播 2.拦截短信,获取其中的验证码 3.回写到EditText private SmsReciver smsReciver = new SmsReciver(); /** 收到短信Action **/ String ACTION_SMS_RECIVER = "android.provider.Telephony.SMS_RECEIVED

  • Android 验证码功能实现代码

    先给大家展示下效果图,如果大家感觉还不错,请参考实现代码 很简单的一个例子,点击刷新验证码,刷新当前显示的验证码,点击确定,如果输入的和显示的匹配,就会跳转到下一个界面中,这里只是实现了跳转,并没有进行其它的操作 好了 接下来就是代码了 首先看MainActivity的布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://sche

  • Android实现短信验证码获取自动填写功能(详细版)

    现在的应用在注册登录或者修改密码中都用到了短信验证码,那在android中是如何实现获取短信验证码并自动填写的呢? 首先,需要要在manifest中注册接收和读取短信的权限: <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> <uses-permission android:name="android.permission.READ_

  • Android账号注册实现点击获取验证码倒计时效果

    网站中为了防止恶意获取验证短信.验证邮箱,都会在点击获取验证码的按钮上做个倒计时的效果,如何实现这个效果,具体内容如下 效果图:   代码: RegisterActivity.java import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.Button; import com.jialianjia.bzw.BaseAct

  • Android实现短信验证码自动拦截读取功能

    知识准备:  1.观察者模式的理解[文章稍后来到~~]  2.Android的Cursor使用[Android基础]  3.正则表达式使用[Java基础]  4.Handler使用[Android基础] 代码整理: MainActivity.java import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.suppo

  • Android获取短信验证码的实现方法

    先给大家展示下效果图,如果感觉不错,请参考实现思路详解 Android开发中关于短息验证码的设计层出不穷,越来越多的应用为了更好的提高软件的安全性,开始使用通过服务器向用户发送验证码的方式,来保护用户个人信息的安全性.无论是用户注册时的信息验证还是当用户发出找回密码请求时的短信验证,他们的工作原理大致上是一致的,因为项目的需要研究了一下关于这方面的知识,本篇我将带领大家一起实现这一当下流行的设计方案. 众所周知,短信验证需要服务器端生成一个验证码,然后发送到用户输入的手机上,这个过程需要服务器主

  • Android本地验证码的简易实现方法(防止暴力登录)

    0.  前言  验证码无处不在,有人问我,你知道达芬奇密码下面是什么吗,对,答案就是达芬奇验证码. 验证码一个最主要的作用就是防止恶意暴力破解登录,防止不间断的登录尝试,有人说其实可以在服务器端对该终端进行登录间隔检测,如果间隔太短可以展示拒绝的姿态.但是还是本地验证码作用更加实在,可以减轻服务器端的压力.这篇将使用自定义View来实现一个如下效果的简易本地验证码.算是对自定义View知识的复习吧. 1.  布局结构  <RelativeLayout xmlns:android="http

  • Android本地验证码的生成代码

    android客户端生成本地验证码主要用来限制用户随意按请求按钮,其实该示例也是来对自定义view的练练手而已,先给出效果图吧 其中可定制: *干扰线数目 *干扰点数目 *背景颜色 *验证码字体大小及字数 相信以上可以满足一般的需要了吧,不够的话可自行添加,下面就来讲实现的步骤了 继承view,重写构造方法,并初始化所需参数 public class ValidationCode extends View { private Paint mTextPaint;//文字画笔 private Pai

  • Android编程实现读取本地SD卡图片的方法

    本文实例讲述了Android编程实现读取本地SD卡图片的方法.分享给大家供大家参考,具体如下: private Bitmap getDiskBitmap(String pathString) { Bitmap bitmap = null; try { File file = new File(pathString); if(file.exists()) { bitmap = BitmapFactory.decodeFile(pathString); } } catch (Exception e)

  • Android拆轮子系列之写验证码控件的方法

    前言 先看看效果 怎么样不错吧?别急下面我就一步一步的教你实现. 用到的知识点总结: 1.Canvas和pint的使用,我们用它画点,线,字 2.View的基本用法 其实做这个东西还是很简单的,总体思路步骤如下: 1.准备一个Canvas. 2.向Canvas里面画几条斜杠. 3.向canvas里面画100个小点. 4.随机生成4个数字,然后画在canvas里面. 其实就是这么简单,没什么深奥的. 开始写编码 1.首先我们要重写View 既然我们要画验证码,那么我们就需要准备画笔(paint)和

  • Android自定义验证码输入框的方法实例

    目录 实践过程 总结 实践过程 前面我们学完了EditText和TextView两个组件,但是,光学不练没意思. 所以今天我们趁热打铁,利用两个组件实现个自定义验证码输入框. 思路前瞻: 隐形EditText接收输入,显性TextView展示内容 时刻监听EditText回调更改内容 自定义RelativeLayout 布局代码: <?xml version="1.0" encoding="utf-8"?><!--自定义验证码View-->

  • Android实现多线程断点下载的方法

    本文实例讲述了Android实现多线程断点下载的方法.分享给大家供大家参考.具体实现方法如下: package cn.itcast.download; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputSt

  • web 开发之创建本地文件夹的实现方法

    web 开发之创建本地文件夹的实现方法 filemanage_util.fullPath 就是创建文件的路径 这是跨平台的创建文件夹,不像Android那样还要通过 Environment.getExternalStorageDirectory() 的原生代码来创建 实现代码: document.addEventListener("deviceready", onDeviceReady, false); function onDeviceReady() { // alert('onde

  • Android编程实现播放音频的方法示例

    本文实例讲述了Android编程实现播放音频的方法.分享给大家供大家参考,具体如下: 在 Android 中播放音频文件一般都是使用 MediaPlayer 类来实现的,它对多种格式的音 频文件提供了非常全面的控制方法,从而使得播放音乐的工作变得十分简单.下表列出了 MediaPlayer 类中一些较为常用的控制方法. 方法名 功能描述 setDataSource() 设置要播放的音频文件的位置. prepare() 在开始播放之前调用这个方法完成准备工作. start() 开始或继续播放音频.

  • Android编程实现的简易路径导航条功能示例

    本文实例讲述了Android编程实现的简易路径导航条功能.分享给大家供大家参考,具体如下: 这里要实现的是如图所示的路径导航条, 类似于文件管理器的效果. 该导航条包含三个功能: 1. 支持追加任意个子路径(文字一行写不下时可左右滑动): 2. 支持返回到上一个路径: 3. 支持点击中间的某个路径回到指定位置. 代码很简单,已封装成自定义View, 如下: PathTextView.Java /** * 显示路径的View,支持返回上一级,支持点击某个位置回到指定层级. */ public cl

  • Android编程实现TCP客户端的方法

    本文实例讲述了Android编程实现TCP客户端的方法.分享给大家供大家参考,具体如下: 因为项目上需要实现一个TCP Client 端:在网上找好多例子基本上都是阻塞方式完成: 我的实现例子:由Activity 及sever 来实现,在sever 创建一个线程来监听接受数据.收到数据,通过广播发送给Activity; 服务端我没有去实现,你可以下载TCP Socket 调试工具v2.2:创建个9005端口:客户端:访问的IP为10.0.2.2 AnetTest.java: /** * Copy

随机推荐