zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

手机端产生本地图形验证码

手机 本地 图形 验证码 产生
2023-09-14 09:00:23 时间

wKiom1XtbzWy6k_fAACxjOjdLlM352.jpg


生成图形验证码校验类

package com.chao.createcode;

import java.util.Random; 

import android.graphics.Bitmap;  

import android.graphics.Canvas;  

import android.graphics.Color;  

import android.graphics.Paint;  

import android.graphics.Bitmap.Config;  

public class Code {  

      

    private static final char[] CHARS = {  

        2, 3, 4, 5, 6, 7, 8, 9,  

        a, b, c, d, e, f, g, h, j, k, m,   

        n, p, q, r, s, t, u, v, w, x, y, z,  

        A, B, C, D, E, F, G, H, I, J, K, L, M,   

        N, P, Q, R, S, T, U, V, W, X, Y, Z  

    };  

      

    private static Code bmpCode;  

      

    public static Code getInstance() {  

        if(bmpCode == null)  

            bmpCode = new Code();  

        return bmpCode;  

    }  

      

    //default settings  

    private static final int DEFAULT_CODE_LENGTH = 4;  

    private static final int DEFAULT_FONT_SIZE = 25;  

    private static final int DEFAULT_LINE_NUMBER = 2;  

    private static final int BASE_PADDING_LEFT = 10, RANGE_PADDING_LEFT = 15, BASE_PADDING_TOP = 15, RANGE_PADDING_TOP = 20;  

    private static final int DEFAULT_WIDTH = 100, DEFAULT_HEIGHT = 40;  

      

    //settings decided by the layout xml  

    //canvas width and height  

    private int width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT;   

      

    //random word space and pading_top  

    private int base_padding_left = BASE_PADDING_LEFT, range_padding_left = RANGE_PADDING_LEFT,   

            base_padding_top = BASE_PADDING_TOP, range_padding_top = RANGE_PADDING_TOP;  

      

    //number of chars, lines; font size  

    private int codeLength = DEFAULT_CODE_LENGTH, line_number = DEFAULT_LINE_NUMBER, font_size = DEFAULT_FONT_SIZE;  

      

    //variables  

    private String code;  

    private int padding_left, padding_top;  

    private Random random = new Random();  

    //验证码图片  

    public Bitmap createBitmap() {  

        padding_left = 0;  

          

        Bitmap bp = Bitmap.createBitmap(width, height, Config.ARGB_8888);   

        Canvas c = new Canvas(bp);  

        code = createCode();  

          

        c.drawColor(Color.WHITE);  

        Paint paint = new Paint();  

        paint.setTextSize(font_size);  

          

        for (int i = 0; i   code.length(); i++) {  

            randomTextStyle(paint);  

            randomPadding();  

            c.drawText(code.charAt(i) + "", padding_left, padding_top, paint);  

        }  

        for (int i = 0; i   line_number; i++) {  

            drawLine(c, paint);  

        }  

          

        c.save( Canvas.ALL_SAVE_FLAG );//保存    

        c.restore();//  

        return bp;  

    }  

      

    public String getCode() {  

        return code;  

    }  

      

    //验证码  

    private String createCode() {  

        StringBuilder buffer = new StringBuilder();  

        for (int i = 0; i   codeLength; i++) {  

            buffer.append(CHARS[random.nextInt(CHARS.length)]);  

        }  

        return buffer.toString();  

    }  

      

    private void drawLine(Canvas canvas, Paint paint) {  

        int color = randomColor();  

        int startX = random.nextInt(width);  

        int startY = random.nextInt(height);  

        int stopX = random.nextInt(width);  

        int stopY = random.nextInt(height);  

        paint.setStrokeWidth(1);  

        paint.setColor(color);  

        canvas.drawLine(startX, startY, stopX, stopY, paint);  

    }  

      

    private int randomColor() {  

        return randomColor(1);  

    }  

    private int randomColor(int rate) {  

        int red = random.nextInt(256) / rate;  

        int green = random.nextInt(256) / rate;  

        int blue = random.nextInt(256) / rate;  

        return Color.rgb(red, green, blue);  

    }  

      

    private void randomTextStyle(Paint paint) {  

        int color = randomColor();  

        paint.setColor(color);  

        paint.setFakeBoldText(random.nextBoolean());  //true为粗体,false为非粗体  

        float skewX = random.nextInt(11) / 10;  

        skewX = random.nextBoolean() ? skewX : -skewX;  

        paint.setTextSkewX(skewX); //float类型参数,负数表示右斜,整数左斜  

//      paint.setUnderlineText(true); //true为下划线,false为非下划线  

//      paint.setStrikeThruText(true); //true为删除线,false为非删除线  

    }  

      

    private void randomPadding() {  

        padding_left += base_padding_left + random.nextInt(range_padding_left);  

        padding_top = base_padding_top + random.nextInt(range_padding_top);  

    }  

}


Activity代码

package com.chao.createcode;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ImageView;

import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

 private ImageView iv_showCode;

 private EditText et_phoneCode;

 private EditText et_phoneNum;

 //产生的验证码

 private String realCode;

 @Override

 protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.activity_main);

  et_phoneCode = (EditText) findViewById(R.id.et_phoneCodes);

  Button but_toSetCode = (Button) findViewById(R.id.but_forgetpass_toSetCodes);

  but_toSetCode.setOnClickListener(this);

  iv_showCode = (ImageView) findViewById(R.id.iv_showCode);

  //将验证码用图片的形式显示出来

  iv_showCode.setImageBitmap(Code.getInstance().createBitmap());

  realCode = Code.getInstance().getCode();

  iv_showCode.setOnClickListener(this);

 @Override

 public void onClick(View v) {

  switch (v.getId()) {

  case R.id.iv_showCode:

   iv_showCode.setImageBitmap(Code.getInstance().createBitmap());

   realCode = Code.getInstance().getCode();

   System.out.println(realCode);

   break;

  case R.id.but_forgetpass_toSetCodes:

   String phoneCode = et_phoneCode.getText().toString();

   if(phoneCode.equalsIgnoreCase(realCode)){

    Toast.makeText(MainActivity.this, phoneCode+"验证码正确", Toast.LENGTH_SHORT).show();

   }else{

    Toast.makeText(MainActivity.this, phoneCode+"验证码错误", Toast.LENGTH_SHORT).show();

   break;

}


布局XML

 ?xml version="1.0" encoding="utf-8"? 

 LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"  

     RelativeLayout

        android:layout_width="match_parent"

        android:layout_height="50dp"

        android:background="@color/main_color_white"  

      

         TextView

            android:id="@+id/tv_title"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_centerInParent="true"

            android:text="找回密码"

            android:textColor="@color/loan_butBackground"

            android:textSize="20sp" / 

        

     /RelativeLayout 

     LinearLayout

        android:layout_width="match_parent"

        android:layout_height="40dp"

        android:layout_marginTop="30dp"

        android:orientation="vertical" 

        android:layout_marginLeft="15dp"

        android:layout_marginRight="15dp"

        android:background="@drawable/linearlayout01" 

       

         LinearLayout

            android:layout_width="match_parent"

            android:layout_height="match_parent"

            android:gravity="center_vertical"

            android:orientation="horizontal"  

             TextView

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_marginLeft="20dp"

                android:layout_marginRight="20dp"

                android:text="中国+86"

                android:textColor="#A2CD5A"

                android:textSize="16sp" / 

             View

                android:layout_width="0.1dp"

                android:layout_height="match_parent"

                android:background="@color/loan_butBackground" / 

             EditText

                android:id="@+id/et_forgetPass_PhoneNum"

                android:layout_width="match_parent"

                android:layout_height="wrap_content"

                android:layout_marginLeft="20dp"

                android:background="@null"

                android:digits="0123456789"

                android:hint="请填入您的手机号"

                android:inputType="number"

                android:maxLength="11"

                android:textSize="16sp" / 

         /LinearLayout 

     /LinearLayout 

     LinearLayout

        

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_marginLeft="15dp"

        android:layout_marginRight="15dp"

        android:layout_marginTop="20dp"

        android:orientation="horizontal"  

         LinearLayout

            android:layout_width="wrap_content"

            android:layout_height="40dp"

            android:background="@drawable/linearlayout01"  

             EditText

                android:id="@+id/et_phoneCodes"

                android:layout_width="match_parent"

                android:layout_height="match_parent"

                android:layout_marginLeft="10dp"

                android:layout_marginRight="10dp"

                android:background="@null"

                android:hint="请输入右侧验证码" / 

         /LinearLayout 

         ImageView

            android:id="@+id/iv_showCode"

            android:layout_width="100dp"

            android:layout_marginLeft="10dp"

            android:layout_height="match_parent" / 

        

     /LinearLayout 

     Button

        android:id="@+id/but_forgetpass_toSetCodes"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_margin="20dp"

        android:background="@drawable/buttonshape"

        android:text="获取手机验证码"

        android:textColor="@color/main_color_white" / 

 /LinearLayout 


参考网站:

http://dwtedx.com/itshare_349.html

 

本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1692459


图形验证码 图形验证码,防止恶意攻击者采用恶意工具批量注册账号或大量频繁调用某些请求,给服务器造成压力,占用大量的系统资源。本文介绍如何实现图形验证码?
C#图形验证码 图形验证码在生活中得到了广泛的应用,在很多登录页面都可以看到验证码的身影。之所以如此,是因为图形验证码可以隔绝不法分子的密码爆破,对我们的登录过程起到了至关重要的保护作用。
KgCaptcha 文字点选验证码数据监控 在信息时代, 对信息处理和利用能力的强弱成为决定企业兴衰成败的关键。一个成熟的数据监控展示平台是我们需要考虑的问题。 下面小编将用KgCaptcha,带领大家使用一个漂亮的数据监控展示平台!
KgCaptcha 图形验证码水印Logo修改 还在苦恼怎么让你的验证码显示Logo吗,KgCaptcha 这个验证码产品,你可以随心所欲地设置你想要的Logo图片、链接地址、位置等。下面我就给大家介绍一下如何设置吧?
KgCaptcha 图形验证码图片样式设置 在一次项目开发中,需要对滑动拼图验证码的宽高、拼图缺口、滑块等样式进行自定义设置,于是我找啊找,终于让我找到了 KgCaptcha,用户可以自己设置验证码尺寸、外框、缺口样式、滑块等。下面就由我来介绍一下如何设置吧!
文字点选行为验证码(KgCaptcha快速入门) 凯格行为验证码 - KgCaptcha,采用业界通用的API接口方式,对接轻松简单,即可享受带来的产品服务能力。自定义样式及风控等级,完全个性化的设置,与你的应用完美融合。自由定义验证场景、安全策略、素材管理、自定义底图、拼图素材、验证模式、验证偏好、背景图片、Logo、跳转链接。定制需求由业务专家制定解决方案,支持私有化部署、多语言切换。