A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Mylan 中级黑马   /  2014-8-11 12:13  /  1903 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Mylan 于 2014-8-12 21:12 编辑

制作一个6位的不同字符的验证码
输出到控制台,用户输入,判断对还是错
6位不同的,数字,字母,汉字
忽略大小写
  1. import java.util.*;
  2. /*
  3. * 制作一个6位的不同字符的验证码
  4. * 输出到控制台,用户输入,判断对还是错
  5. * 6位不同的,数字,字母,汉字
  6. * 忽略大小写
  7. */
  8. public class lianxi2 {
  9.         public static void main(String[] args) {
  10.                 while(!yanzheng()){
  11.                         System.out.println("亲,不要灰心!");
  12.                 }
  13.                
  14.         }
  15.         public static boolean yanzheng(){
  16.                 Scanner in=new Scanner(System.in);
  17.                 String[] ku=new String[]{"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","A","B","C","D","E","F","G"};
  18.                 int i;
  19.                 StringBuffer yanzheng=new StringBuffer();
  20.                 while(yanzheng.length()<6){
  21.                         //没有去重
  22.                         i=new Random().nextInt(ku.length);
  23.                         yanzheng.append(ku[i]);
  24.                 }
  25.                 String yz=yanzheng.substring(0);
  26.                 System.out.println(yz);
  27.                 System.out.println("请输入验证码:");
  28.                 String shuru=in.nextLine();
  29.                 //忽略大小写
  30.                 if (yz.equalsIgnoreCase(shuru)) {
  31.                         System.out.println("验证通过!");
  32.                         return true;
  33.                 }else{
  34.                         System.out.println("验证失败,请重新验证。");
  35.                         return false;
  36.                 }
  37.         }
  38. }
复制代码
打印结果:
  1. 21d176
  2. 请输入验证码:
  3. 12352d
  4. 验证失败,请重新验证。
  5. 亲,不要灰心!
  6. 0EdB4b
  7. 请输入验证码:
  8. adf2123132123
  9. 验证失败,请重新验证。
  10. 亲,不要灰心!
  11. 55age6
  12. 请输入验证码:
  13. wod
  14. 验证失败,请重新验证。
  15. 亲,不要灰心!
  16. B07Cd5
  17. 请输入验证码:
  18. b07cd5
  19. 验证通过!
复制代码

对于字符库里的1 2  3字符只能定义在数组里吗,那要是汉字的验证码,不是要把所有的汉字都放到数组里了。
就不能指定一个范围吗,比如0-9,A-Z,a-z
还能在完善吗


评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 神马都是浮云

查看全部评分

7 个回复

倒序浏览
去看看正则表达式,可能解决你的问题
回复 使用道具 举报
1. 如果有现成的验证码库,直接用人家的代码是最好的,无需重复发明轮子
2. 如果非要自己实现,一个可行的思路是从unicode字符集中把你所需的编码范围挑出来(因为你需要字母、数字和汉子,这个范围肯定是不连续的,至少分成3块),然后用自然数的一个连续子集(0-N)去跟挑出来的编码建立一一映射(可以用Map或数组实现)。之后只需要产生这个自然数连续子集范围内的随机数就可以生成对应的验证码字符了

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 很给力!

查看全部评分

回复 使用道具 举报

代码一:
把需要验证的字符串,字母,数字,以及汉字都可以,添加入char类型的数组即可,直接添加即可,不需要修改其余的代码。


  1. package cn.itcast.collection;

  2. import java.util.Random;
  3. import java.util.Scanner;

  4. public class Test2 {
  5.         /**
  6.          *         制作一个6位的不同字符的验证码
  7.                 输出到控制台,用户输入,判断对还是错
  8.                 6位不同的,数字,字母,汉字       
  9.          */
  10.         public static void main(String[] args) {
  11.                 char[] ch = {'1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
  12.                 Random ra = new Random();
  13.                 Scanner sc = new Scanner(System.in);
  14.                 int x =ra.nextInt(ch.length+1);
  15.                 StringBuffer sb = new StringBuffer();
  16.                 for (int i = x; sb.length() < 6 ; ) {
  17.                         String s = String.valueOf(ch[x]);
  18.                         if(!sb.toString().contains(s))
  19.                                 sb.append(ch[x]);
  20.                         x =ra.nextInt(ch.length+1);
  21.                 }
  22.                 System.out.println(sb);
  23.                 System.out.println("请输入验证码:");
  24.                
  25.                 String in = sc.nextLine();
  26.                 if(in.equals(sb.toString()))       
  27.                         System.out.println("验证码输入正确!");
  28.                 else
  29.                         System.out.println("验证码输入错误!");
  30.                        
  31.         }

  32. }
复制代码




代码二:
把需要验证的字符串,字母,数字,以及汉字都可以,添加入String s,直接添加即可,不需要修改其余的代码。





  1. package cn.itcast.collection;

  2. import java.util.Random;
  3. import java.util.Scanner;

  4. /**
  5. *         制作一个6位的不同字符的验证码
  6.         输出到控制台,用户输入,判断对还是错
  7.         6位不同的,数字,字母,汉字       
  8. */
  9. public class Test3 {
  10.         public static void main(String[] args) {
  11.                 String s = "0123456789qwertyuiopasdfghjklzxcvbnm" ;
  12.                 Random ran = new Random();
  13.                 int num = ran.nextInt(s.length()+1);
  14.                 StringBuffer sb = new StringBuffer();
  15.                 Scanner sc  = new Scanner(System.in);
  16.                 for (int i = num; sb.length() < 6; ) {
  17.                         String ss = String.valueOf(s.charAt(num));
  18.                         if(sb.indexOf(ss)==-1)
  19.                                 sb.append(s.charAt(num));
  20.                         num = ran.nextInt(s.length()+1);                       
  21.                 }
  22.                 System.out.println("验证码:"+sb);
  23.                 System.out.println("请输入验证码:");
  24.                 if(sb.toString().equals(sc.nextLine()))
  25.                         System.out.println("验证码正确!");
  26.                 else
  27.                         System.out.println("验证码错误!");
  28.                
  29.         }
  30. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 赞一个!

查看全部评分

回复 使用道具 举报
烟海 发表于 2014-8-11 12:45
代码一:
把需要验证的字符串,字母,数字,以及汉字都可以,添加入char类型的数组即可,直接添加即可,不 ...

如果做汉字验证码   咋办
回复 使用道具 举报
Mylan 发表于 2014-8-11 14:35
如果做汉字验证码   咋办

把汉字直接加进char类型的数组。。或者加进String类型的字符串里面。。。会正常显示和输出的。。。。
回复 使用道具 举报
Mylan 中级黑马 2014-8-11 15:01:04
7#
烟海 发表于 2014-8-11 14:41
把汉字直接加进char类型的数组。。或者加进String类型的字符串里面。。。会正常显示和输出的。。。。
...

全部的的汉字都加进去吗   不是太多了啊
回复 使用道具 举报
烟海 中级黑马 2014-8-11 15:50:26
8#
Mylan 发表于 2014-8-11 15:01
全部的的汉字都加进去吗   不是太多了啊

选择性的啊。。。。加一部分。。。。。
你需要什么就加什么啊。。。

现在那些网站的验证码。。也是一样的。。需要什么加什么。。。

有时候多也没办法啊。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马