热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

验证马真是无处不在啊,主要作用是防止恶意暴力破解登录,这篇文章主要介绍了Android本地验证码的简易实现方法(防止暴力登录),需要的朋友可以参考下

0.  前言 

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

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

1.  布局结构 

 
  
  
 

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

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

<&#63;xml version="1.0" encoding="utf-8"&#63;> 
 
  
   
   
   
  
 

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 

核心代码就是解析自定义属性,并初始化一个画笔,并把解析出来的字体大小设置给画笔,设计点击时间,使其被点击后重新随机产生四位数字验证码,并使用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本地验证码的简易实现方法(防止暴力登录),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


推荐阅读
  • 【自制小工具】代码生成器
    【自制小工具】代码生成器陆陆续续接触过好几款代码生成工具,发现确实好用,但都会有那么点不完善的地方,所以索性就自己做一个吧。界面非常简单,反正是自己用的,简单点用起来也方便上图:左 ... [详细]
  • kepserver中文手册,kepserver使用教程,kepserver设置
    下面介绍一下KepServer模拟器的使用,以下示例使用服务器随附的Simulator驱动程序来演示创建、配置和运行项目的过程。Simulator驱动程序是基于内存的驱动程序,能为 ... [详细]
  • 一、基本Tag1.Tag定义了Item实例,有三个基本的属性来定义一个item实例,大小写敏感。id-每个Item实例的唯一标识type ... [详细]
  • Android的四种启动模式
     对Android的启动模式不是很了解,这里记录下简单的理解内容以便日后查看。 Androi的四种启动模式分别为:standard,singleTop,singleTask,sing ... [详细]
  • 作业迁移
    背景:数据库服务器更换,1、数据库迁移(BACKUPRESTORE);2、数据库登录名用户迁移(注意孤立用户);3、作业迁移数据库迁移,备份数据库、拷贝备份文件到新服务器,还原数据 ... [详细]
  • 如何通过Wifi将Android设备与PC连接
    什么是Appium?设置AppiumAppium基础知识Appium中级要知道的事情如何查找APK文件的appPackage和appActivity转移APK从手机到 ... [详细]
  • 一、使用ContentProvider(内容提供者)共享数据ContentProvider在android中的作用是对外共享数据,也就是说 ... [详细]
  • 安全加密C语言库OpenSSL,在Android中服务器和客户端之间的签名验证和数据加密通信等。OpenSSL系列文章:一、AndroidCMake轻松 ... [详细]
  • 《每个设计师都应该掌握的50个css代码段》11~20段
    2019独角兽企业重金招聘Python工程师标准11.胶卷边框img.polaroid{background:#000;*Changethistoabackgroundima ... [详细]
  • 一、在androidStudio中实现tabs比较简单,新建项目就可以选择tabs模板进行创建,默认实现tabs功能:直接运行项目就可以看到效果:可以说非常简单,但是我们在实际开发 ... [详细]
  • 抓取百万知乎用户设计之实体设计
    一.实体的关系实体是根据返回的Json数据来设计的教育经历方面用户可以有很多教育经理,USER和education是一对多的关系,一个education对应一个education一 ... [详细]
  • Xib九宫格应用管理使用xib封装一个自定义view的步骤1新建一个继承UIView的自定义view,假设类名叫做(AppView)2新建一个AppView.xib文件来描述 ... [详细]
  • centosFedoraRHEL•整改方法:•验证检查:1、查看etclogin.defs,访谈询问当前所设置的密码长度及更换周期 ... [详细]
  • socket.io是个基于node.js的快平台实时通讯框架。只用不到10行代码,就可以搭建一个简单的多人实时聊天室。先来看看运行后的效果:socket.io多人聊天室只要简单几 ... [详细]
  • github:https:github.comfroghuiyolandaIO模型和多线程模型实现多线程设计的几个考虑在我们的设计中,mainre ... [详细]
author-avatar
弓X箭_281
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有