代码之家  ›  专栏  ›  技术社区  ›  Shubham Kanugo

检查验证码的条件是什么

  •  0
  • Shubham Kanugo  · 技术社区  · 8 年前

    我试图检查注册表单中的验证码,该表单是在项目中从java文件静态生成的。但我无法追踪条件来检查验证码,它一直显示错误。无论验证码是否匹配,它总是显示无效的验证码。下面是代码。

    主要活动。Java语言

                          Submit_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //isValidData();
                if (isValidData()){
                    if (textCaptcha.checkAnswer(Usercapt.getText().toString().trim())) {
                        /*AlertDialog.Builder alt = new AlertDialog.Builder(MainActivity.this);
                        alt.setMessage("Invalid Captcha");
                        alt.setCancelable(true);
                        alt.setPositiveButton("ok", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        });
                        AlertDialog alertDialog = alt.create();
                        alertDialog.show();*/
                        Toast.makeText(MainActivity.this, "captch match", Toast.LENGTH_SHORT).show();
    
                    } else{
                       /* Toast.makeText(MainActivity.this, "Successful Registration", Toast.LENGTH_SHORT).show();
                        Intent i = new Intent(MainActivity.this, Login_Activity.class);
                        startActivity(i);*/
                        Toast.makeText(MainActivity.this, "captcha not match", Toast.LENGTH_SHORT).show();
    
                    }
                } else {
    
                    /*here the code to save the data in data base will be written*/
                    Toast.makeText(MainActivity.this, "Registration Failed, Register again", Toast.LENGTH_SHORT).show();
    
                }
    
            }
        });
    

           package com.mws.tms_application;
    
       import android.graphics.Bitmap;
     import android.graphics.Color;
    
     import java.util.List;
     import java.util.Random;
    
    
    
    public abstract class Captcha {
    protected Bitmap image;
    protected String answer = "";
    private int width;
    protected int height;
    protected int x = 0;
    protected int y = 0;
    protected static List usedColors ;
    
    protected abstract Bitmap image();
    
    public static int color(){
        Random r = new Random();
        int number;
        do{
            number = r.nextInt(9);
        }while(usedColors.contains(number));
        usedColors.add(number);
        switch(number){
            case 0: return Color.BLACK;
            case 1: return Color.BLUE;
            case 2: return Color.CYAN;
            case 3: return Color.DKGRAY;
            case 4: return Color.GRAY;
            case 5: return Color.GREEN;
            case 6: return Color.MAGENTA;
            case 7: return Color.RED;
            case 8: return Color.YELLOW;
            case 9: return Color.WHITE;
            default: return Color.WHITE;
        }
    }
    
    public int getWidth(){
        return this.width;
    }
    
    public void setWidth(int width){
        if(width > 0 && width < 10000){
            this.width = width;
        }else{
            this.width = 300;
        }
    }
    
    public int getHeight(){
        return this.height;
    }
    
    public void setHeight(int height){
        if(height > 0 && height < 10000){
            this.height = height;
        }else{
            this.height = 100;
        }
    }
    
    public Bitmap getImage() {
        return this.image;
    }
    
    public boolean checkAnswer(String ans) {
        /*System.out.println("ans received here"+ans);
        System.out.println("captcha"+answer);*/
        return (ans.equals(this.answer));
    
    
    }
    }
    

    text验证码。Java语言

             package com.mws.tms_application;
    
     import android.graphics.Bitmap;
     import android.graphics.Canvas;
     import android.graphics.LinearGradient;
     import android.graphics.Paint;
     import android.graphics.Shader;
    
     import java.io.CharArrayWriter;
     import java.util.ArrayList;
     import java.util.Random;
    
    
    
     public class TextCaptcha extends Captcha {
    
    protected TextOptions options;
    private int wordLength;
    private char mCh;
    
    public enum TextOptions {
        UPPERCASE_ONLY,
        LOWERCASE_ONLY,
        NUMBERS_ONLY,
        LETTERS_ONLY,
        NUMBERS_AND_LETTERS
    }
    
    public TextCaptcha(int wordLength, TextOptions opt) {
        new TextCaptcha(0, 0, wordLength, opt);
    }
    
    public TextCaptcha(int width, int height, int wordLength, TextOptions opt) {
        setHeight(height);
        setWidth(width);
        this.options = opt;
        usedColors = new ArrayList<>();
        this.wordLength = wordLength;
        this.image = image();
    }
    
    @Override
    protected Bitmap image() {
        LinearGradient gradient = new LinearGradient(0, 0, getWidth() / this.wordLength, getHeight() / 2, color(), color(), Shader.TileMode.CLAMP);
        Paint p = new Paint();
        p.setDither(true);
        p.setShader(gradient);
        Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(bitmap);
        c.drawRect(0, 0, getWidth(), getHeight(), p);
        Paint tp = new Paint();
        tp.setDither(true);
        tp.setTextSize(getWidth() / getHeight() * 20);
    
        Random r = new Random(System.currentTimeMillis());
        CharArrayWriter cab = new CharArrayWriter();
        this.answer = " ";
        for (int i = 0; i < this.wordLength; i++) {
            char ch = ' ';
            switch (options) {
                case UPPERCASE_ONLY:
                    ch = (char) (r.nextInt(91 - 65) + (65));
                    break;
                case LOWERCASE_ONLY:
                    ch = (char) (r.nextInt(123 - 97) + (97));
                    break;
                case NUMBERS_ONLY:
                    ch = (char) (r.nextInt(58 - 49) + (49));
                    break;
                case LETTERS_ONLY:
                    ch = getLetters(r);
                    break;
                case NUMBERS_AND_LETTERS:
                    ch = getLettersNumbers(r);
                    break;
                default:
                    ch = getLettersNumbers(r);
                    break;
            }
            cab.append(ch);
            this.answer += ch;
        }
    
        char[] data = cab.toCharArray();
        for (int i = 0; i < data.length; i++) {
            this.x += (30 - (3 * this.wordLength)) + (Math.abs(r.nextInt()) % (65 - (1.2 * this.wordLength)));
            this.y = 50 + Math.abs(r.nextInt()) % 50;
            Canvas cc = new Canvas(bitmap);
            tp.setTextSkewX(r.nextFloat() - r.nextFloat());
            tp.setColor(color());
            cc.drawText(data, i, 1, this.x, this.y, tp);
            tp.setTextSkewX(0);
        }
        return bitmap;
    }
    
    private char getLetters(Random r) {
        int rint = (r.nextInt(123 - 65) + (65));
        if (((rint > 90) && (rint < 97)))
            getLetters(r);
        else
            mCh = (char) rint;
        return mCh;
    }
    
    private char getLettersNumbers(Random r) {
        int rint = (r.nextInt(123 - 49) + (49));
    
        if (((rint > 90) && (rint < 97)))
            getLettersNumbers(r);
        else if (((rint > 57) && (rint < 65)))
            getLettersNumbers(r);
        else
            mCh = (char) rint;
        return mCh;
    }
    }
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Yazan    8 年前

    就是这样

    您初始化 answer 使用空格,而不是空字符串:

    this.answer = " ";
    

    " 1234567" .

    this.answer = "";
    

    或使用 trim() 答复 比较时

    public boolean checkAnswer(String ans) {
        /*System.out.println("ans received here"+ans);
        System.out.println("captcha"+answer);*/
        return (ans.equals(this.answer.trim()));
    }
    

    建议使用空字符串进行初始化 答复