JAVA技术:代码实现验证码图片的生成

本文涉及的产品
简介:

Servlet生成验证码图片

1   package  com.logcd.servlet;  
2    
3   import  java.awt.Color;  
4   import  java.awt.Font;  
5   import  java.awt.Graphics2D;  
6   import  java.awt.image.BufferedImage;  
7   import  java.util.Random;  
8   import  javax.imageio.ImageIO;  
9   import  javax.servlet. *
10   import  java.io. *
11   import  javax.servlet.http. *
12   import  javax.servlet.ServletException; 
13   import  javax.servlet.http.HttpServlet; 
14   import  javax.servlet.http.HttpServletRequest; 
15   import  javax.servlet.http.HttpServletResponse; 
16   
17  @SuppressWarnings( " serial "
18   public   class  RandomCode  extends  HttpServlet { 
19   
20       public   void  doGet(HttpServletRequest request, HttpServletResponse response) 
21               throws  ServletException, IOException { 
22   
23           this .doPost(request, response); 
24      } 
25   
26       public   void  doPost(HttpServletRequest request, HttpServletResponse response) 
27               throws  ServletException, IOException { 
28   
29           //  验证码图片的宽度。 
30           int  width  =   70
31           //  验证码图片的高度。 
32           int  height  =   30
33          BufferedImage buffImg  =   new  BufferedImage(width, height,  34                  BufferedImage.TYPE_INT_RGB); 
35          Graphics2D g  =  buffImg.createGraphics(); 
36   
37           //  创建一个随机数生成器类。 38         Random random = new Random(); 39  40          //  设定图像背景色(因为是做背景,所以偏淡) 
41          g.setColor(getRandColor( 200 250 )); 
42          g.fillRect( 0 0 , width, height); 
43           //  创建字体,字体的大小应该根据图片的高度来定。 
44          Font font  =   new  Font( " Times New Roman " , Font.HANGING_BASELINE,  28 );  45           //  设置字体。 
46          g.setFont(font);  47    48           //  画边框。 49         g.setColor(Color.BLACK); 50         g.drawRect(0, 0, width - 1, height - 1); 
51           //  随机产生155条干扰线,使图象中的认证码不易被其它程序探测到。 
52   // g.setColor(Color.GRAY); 
53          g.setColor(getRandColor( 160 , 200 )); 
54           for  ( int  i  =   0 ; i  <   155 ; i ++ ) { 
55               int  x  =  random.nextInt(width); 
56               int  y  =  random.nextInt(height); 
57               int  xl  =  random.nextInt( 12 ); 
58               int  yl  =  random.nextInt( 12 ); 
59              g.drawLine(x, y, x  +  xl, y  +  yl); 
60          } 
61   
62           //  randomCode用于保存随机产生的验证码,以便用户登录后进行验证。 
63          StringBuffer randomCode  =   new  StringBuffer(); 
64   
65           //  设置默认生成4个验证码 
66           int  length  =   4
67           //  设置备选验证码:包括"a-z"和数字"0-9" 68         String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; 
69   
70           int  size  =  base.length(); 
71   
72           //  随机产生4位数字的验证码。 
73           for  ( int  i  =   0 ; i  <  length; i ++ ) {  74               //  得到随机产生的验证码数字。 75             int start = random.nextInt(size); 
76              String strRand  =  base.substring(start, start  +   1 ); 
77   
78               //  用随机产生的颜色将验证码绘制到图像中。 
79   //  生成随机颜色(因为是做前景,所以偏深) 80  // g.setColor(getRandColor(1, 100)); 81              
82   // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成 
83              g.setColor( new  Color( 20 + random.nextInt( 110 ), 20 + random.nextInt( 110 ), 20 + random.nextInt( 110 ))); 
84   
85              g.drawString(strRand,  15   *  i  +   6 24 ); 
86   
87               //  将产生的四个随机数组合在一起。 
88              randomCode.append(strRand); 
89          } 
90           //  将四位数字的验证码保存到Session中。 
91          HttpSession session  =  request.getSession(); 
92          session.setAttribute( " rand " , randomCode.toString()); 
93   
94           // 图象生效 
95          g.dispose(); 
96   
97           //  禁止图像缓存。 
98          response.setHeader( " Pragma " " no-cache " ); 
99          response.setHeader( " Cache-Control " " no-cache " );
100          response.setDateHeader( " Expires " 0 );
101  
102          response.setContentType( " image/jpeg " );
103  
104           //  将图像输出到Servlet输出流中。105         ServletOutputStream sos = response.getOutputStream();
106          ImageIO.write(buffImg,  " jpeg " , sos);
107          sos.flush();
108          sos.close();
109  
110      }
111  
112      Color getRandColor( int  fc,  int  bc) { //  给定范围获得随机颜色
113          Random random  =   new  Random();
114           if  (fc  >   255 )
115              fc  =   255 ;
116           if  (bc  >   255 )
117              bc  =   255 ;
118           int  r  =  fc  +  random.nextInt(bc  -  fc);
119           int  g  =  fc  +  random.nextInt(bc  -  fc);
120           int  b  =  fc  +  random.nextInt(bc  -  fc);
121           return   new  Color(r, g, b);
122      }
123  
124  }

   配置

1       < servlet >
2           < servlet - name > RandomCode </ servlet - name >
3           < servlet - class > com.logcd.servlet.RandomCode </ servlet - class >
4       </ servlet >
5       < servlet - mapping >
6           < servlet - name > RandomCode </ servlet - name >
7           < url - pattern >/ randomCode </ url - pattern >
8       </ servlet - mapping >

  调用

1   < meta http - equiv = " Content-Type "  content = " text/html; charset=gb2312 "   />  
2   < meta http - equiv = " pragma "  content = " no-cache " />  
3   < meta http - equiv = " cache-control "  content = " no-cache " />  
4   < meta http - equiv = " expires "  content = " 0 " />  
5   
6   < iframe src = " http://127.0.0.1/js_test/randomCode "  id = " codeFrame "  name = " codeFrame "  frameborder = " no "  border = " 0 "  marginwidth = " 0 "  
7       marginheight = " 0 "  scrolling = " no "  allowtransparency = " yes "  height = " 35 "  width = " 102 " ></ iframe >  
8        < a href = " javascript:void(0); "  onclick = " refreshCode(); " > 看不清,换一张 </ a >  
9       < br >  
10       < span id = " codeImg " >< img border = 0  src = " randomCode " ></ span >
11       < a href = " javascript:void(0); "  onclick = " reloadCode() " > 看不清,再换一张 </ a >
1  function $(id){ 
2       return  document.getElementById(id); 
3  } 
4   
5   /** 刷新iframe* */  
6  function refreshCode(){ 
7      window.frames[ " codeFrame " ].location.reload(); 
8  } 
9  
10   /** 替换图片* */
11  function reloadCode(){
12      $( " codeImg " ).innerHTML  =   " <img border=0 src='randomCode'> " ;
13  }









本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/735595,如需转载请自行联系原作者
相关实践学习
基于函数计算一键部署掌上游戏机
本场景介绍如何使用阿里云计算服务命令快速搭建一个掌上游戏机。
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
5天前
|
Java 测试技术 应用服务中间件
常见 Java 代码缺陷及规避方式(下)
常见 Java 代码缺陷及规避方式(下)
25 0
|
7天前
|
Java
Java中ReentrantLock释放锁代码解析
Java中ReentrantLock释放锁代码解析
24 8
|
10天前
|
前端开发 小程序 Java
uniapp上传图片 前端以及java后端代码实现
uniapp上传图片 前端以及java后端代码实现
27 0
|
12天前
|
设计模式 存储 Java
23种设计模式,享元模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享技术有效地支持大量细粒度对象的重用。这个模式在处理大量对象时非常有用,特别是当这些对象中的许多实例实际上可以共享相同的状态时,从而可以减少内存占用,提高程序效率
30 4
|
12天前
|
设计模式 Java 中间件
23种设计模式,适配器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】适配器模式(Adapter Pattern)是一种结构型设计模式,它的主要目标是让原本由于接口不匹配而不能一起工作的类可以一起工作。适配器模式主要有两种形式:类适配器和对象适配器。类适配器模式通过继承来实现适配,而对象适配器模式则通过组合来实现
30 4
|
5天前
|
Java
代码的魔法师:Java反射工厂模式详解
代码的魔法师:Java反射工厂模式详解
18 0
|
5天前
|
监控 安全 Java
常见 Java 代码缺陷及规避方式(中)
常见 Java 代码缺陷及规避方式(中)
15 1
|
7天前
|
设计模式 算法 Java
23种设计模式,模板方法模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
11 0
|
8天前
|
设计模式 Java
23种设计模式,状态模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。
25 4
|
10天前
|
设计模式 Java
23种设计模式,命令模式的概念优缺点以及JAVA代码举例
【4月更文挑战第7天】命令模式是一种行为设计模式,它将请求或简单操作封装为一个对象。这种模式允许用户通过调用对象来参数化其他对象的方法,并能保存、排队和执行方法调用。
16 1