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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wangyafeng1990 中级黑马   /  2013-10-19 17:05  /  1240 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 wangyafeng1990 于 2013-10-19 20:01 编辑

要求:有大小写字母,数字,且数字字母的出现是随机的

8 个回复

倒序浏览
  1. package ytu.edu.checkcode;

  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.Graphics;
  5. import java.awt.Graphics2D;
  6. import java.awt.image.BufferedImage;
  7. import java.io.IOException;
  8. import java.io.PrintWriter;
  9. import java.util.Random;

  10. import javax.imageio.ImageIO;
  11. import javax.servlet.ServletException;
  12. import javax.servlet.http.HttpServlet;
  13. import javax.servlet.http.HttpServletRequest;
  14. import javax.servlet.http.HttpServletResponse;

  15. public class ImageServlet extends HttpServlet {

  16.         private static final int WIDTH =120;
  17.         private static final int HIGHT=35;
  18.         public void doGet(HttpServletRequest request, HttpServletResponse response)
  19.                         throws ServletException, IOException {
  20.                 //创建
  21.                 BufferedImage bufferedimage=new BufferedImage(WIDTH, HIGHT, BufferedImage.TYPE_INT_RGB);
  22.                 //获取
  23.                 Graphics g=bufferedimage.getGraphics();
  24.                 //设置背景色
  25.                 setBackground(g);
  26.                 //设置边框
  27.                 setBorder(g);
  28.                 //设这干扰线
  29.                 drawRandomLine(g);
  30.                 //写随机数
  31.                 String checkcode=drawRandomNum((Graphics2D)g);//强制转换
  32.                 request.getSession().setAttribute("checkcode", checkcode);
  33.                 //将图形写给浏览器
  34.                 response.setContentType("image/jpeg");
  35.                 ImageIO.write(bufferedimage, "jpg", response.getOutputStream());
  36.                
  37.                 }

  38.        
  39.         private String drawRandomNum(Graphics2D g) {
  40.                 g.setColor(Color.GRAY);
  41.                 g.setFont(new Font("宋体", Font.BOLD, 20));
  42.                 char[] chars={'A','B','C','D','E','F','G','H','I','J','K','L','M','N',
  43.                         'P','Q','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9'};
  44.                 int x=10;
  45.                 StringBuffer sb=new StringBuffer();
  46.                 for(int i=0;i<4;i++){
  47.                         int degree=new Random().nextInt()%30;//旋转的度数
  48.                     int index=new Random().nextInt(chars.length);
  49.                     String s=chars[index]+"";
  50.                     sb.append(s);
  51.                     g.rotate(degree*Math.PI/180, x, 20);
  52.                         g.drawString(s, x, 20);
  53.                         g.rotate(-degree*Math.PI/180, x, 20);//清除旋转不让其影响下一次旋转
  54.                        
  55.                         x=x+30;
  56.                 }
  57.                 return sb.toString();
  58.                
  59.         }


  60.         private void drawRandomLine(Graphics g) {
  61.                 g.setColor(Color.GREEN);
  62.                
  63.                 for(int i=0;i<=10;i++){
  64.                         int x1=new Random().nextInt(WIDTH);
  65.                         int y1=new Random().nextInt(HIGHT);
  66.                         int x2=new Random().nextInt(WIDTH);
  67.                         int y2=new Random().nextInt(HIGHT);
  68.                         g.drawLine(x1, y1, x2, y2);
  69.                 }
  70.                
  71.         }


  72.         private void setBorder(Graphics g) {
  73.         g.setColor(Color.BLUE);
  74.         g.drawRect(1, 1, WIDTH-2, HIGHT-2);
  75.        
  76.                
  77.         }


  78.         private void setBackground(Graphics g) {
  79.                 g.setColor(Color.WHITE);
  80.                 g.fillRect(0, 0, WIDTH,HIGHT);
  81.                
  82.         }


  83.         public void doPost(HttpServletRequest request, HttpServletResponse response)
  84.                         throws ServletException, IOException {

  85.                 doGet(request, response);
  86.         }

  87. }
复制代码
这是个servlet 直接访问就能产生验证码希望对你有帮助

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
fengche 发表于 2013-10-19 17:47
这是个servlet 直接访问就能产生验证码希望对你有帮助

代码里面少个0,不过真心感谢啊!问题解决
回复 使用道具 举报
  1.   public  static char  NumGet()
  2.             {
  3.                      Random  rd = new Random();
  4.                         return  (char)(rd.nextInt(10)+48);
  5.                 }
  6.             
  7.             public static char BigCharGet()
  8.             {
  9.                      Random  rd = new Random();
  10.                         return  (char)(rd.nextInt(26)+65);
  11.             }
  12.             
  13.             public  static char SmallCharGet()
  14.             {
  15.                      Random  rd = new Random();
  16.                         return  (char)(rd.nextInt(26)+97);
  17.             }
复制代码
以上是产生 a-z  A-Z  0-9 的三个函数


  StringBuilder sb = new StringBuilder();              
                
                  for(int x=0;x<4;x++)
                 {                       
                          int choice  = (int) (Math.random()*3);
                                          
                          if(choice == 1)
                                  sb.append(NumGet());
                          else if(choice ==2)
                                  sb.append(BigCharGet());
                          else
                                  sb.append(SmallCharGet());                                  
                 }             

                  System.out.println(sb);          


解释:
     对着三个函数进行随机调用  4次 就成功了

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
  1.   public  static char  NumGet()
  2.             {
  3.                      Random  rd = new Random();
  4.                         return  (char)(rd.nextInt(10)+48);
  5.                 }
  6.             
  7.             public static char BigCharGet()
  8.             {
  9.                      Random  rd = new Random();
  10.                         return  (char)(rd.nextInt(26)+65);
  11.             }
  12.             
  13.             public  static char SmallCharGet()
  14.             {
  15.                      Random  rd = new Random();
  16.                         return  (char)(rd.nextInt(26)+97);
  17.             }
复制代码
以上是产生 a-z  A-Z  0-9 的三个函数


  StringBuilder sb = new StringBuilder();              
                
                  for(int x=0;x<4;x++)
                 {                       
                          int choice  = (int) (Math.random()*3);
                                          
                          if(choice == 1)
                                  sb.append(NumGet());
                          else if(choice ==2)
                                  sb.append(BigCharGet());
                          else
                                  sb.append(SmallCharGet());                                  
                 }             

                  System.out.println(sb);          


解释:
     对着三个函数进行随机调用  4次 就成功了
回复 使用道具 举报
上篮高手 发表于 2013-10-19 18:13
以上是产生 a-z  A-Z  0-9 的三个函数

谢谢你的答案,太感谢了
回复 使用道具 举报
class  Demo
{
        public static void main(String[] args)
        {
                        //填充字符
                String data = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
               
                //缓存随机生成的字符
                StringBuffer buf = new StringBuffer();
               
                //随机获得4个字符
                Random random = new Random();
                for(int i = 0 ; i < 4 ; i++){
                        //获得一个随机字符
                        int index = random.nextInt(62);
                        //截取字符串
                        String str = data.substring(index, index + 1);  
                        //需要将随机的字符,写到图片中
                        buf.append(str);
                }
        }
}
回复 使用道具 举报 1 0


如果楼主已经解惑,请将帖子改为提问结束
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马