纯JAVA技术验证码生成器(服务器端servlet实现)
	
		
		系统
		
		2094 0
	
	  
  
                <!-- Feedsky FEED发布代码开始 --> <!-- FEED自动发现标记开始 --> 点击这里使用RSS订阅本Blog: <link rel="alternate" href="http://feed.feedsky.com/softwave" type="application/rss+xml" title="RSS 2.0"> <!-- FEED自动发现标记结束 --><script language="javascript"><!-- main_sub="c1s67"; more_subs=""; --> </script><script language="javascript" src="http://www.feedsky.com/jsout/publishlist_v2.js?burl=softwave&out_html=true"></script><!-- Feedsky FEED发布代码结束 --> 
  
    
      import java.awt.Color; 
      
       import java.awt.Font; 
      
       import java.awt.Graphics; 
      
       import java.awt.image.BufferedImage; 
      
       import java.io.IOException; 
      
       import java.util.Random; 
      
       import javax.servlet.ServletOutputStream; 
      
       import javax.servlet.http.HttpServletRequest; 
      
       import javax.servlet.http.HttpServletResponse; 
      
       import com.sun.image.codec.jpeg.JPEGCodec; 
      
       import com.sun.image.codec.jpeg.JPEGImageEncoder; 
      
    
    
      /** 
      
       * @(#)VerifyCodeServlet.java Dec 9, 2007 8:14:14 PM 
      
       * 
      
       * @author Yuan 
      
       * 验证码生成器,使用此类需要将表单里的验证码输入框的name属性设为"verifycode" 
      
       */ 
      
       public class VerifyCodeGenerator { 
      
      
       private static final VerifyCodeGenerator generator = new VerifyCodeGenerator(); 
      
      
       private final String ATTRIBUTE_NAME = "verifycode"; 
      
       //图片的宽度 
      
       private final int WIDTH = 15; 
      
       //图片的高度 
      
       private final int HEIGHT = 22; 
      
       //字符串长度 
      
       private final int CODE_LENGTH = 4; 
      
       //随机字符串范围 
      
       private final String RAND_RANGE = "abcdefghijklmnopqrstuvwxyz" 
      
       + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
      
       + "1234567890" 
      
       + "@#quot;; 
      
      
       private final char[] CHARS = RAND_RANGE.toCharArray(); 
      
      
       private Random random = new Random(); 
      
      
       private VerifyCodeGenerator(){ 
      
       // 
      
       } 
      
      
       public static VerifyCodeGenerator getInstance(){ 
      
       return generator; 
      
       }
      
    
    
    
      /** 
      
       * 生成随机字符串 
      
       * @return 随机字符串 
      
       */ 
      
       private String getRandString(){ 
      
       StringBuilder sb = new StringBuilder(); 
      
       for (int i = 0; i < CODE_LENGTH; i++) 
      
       sb.append(CHARS[random.nextInt(CHARS.length)]); 
      
       return sb.toString(); 
      
       } 
      
      
       /** 
      
       * 生成随机颜色 
      
       * @param ll 产生颜色值下限(lower limit) 
      
       * @param ul 产生颜色值上限(upper limit) 
      
       * @return 生成的随机颜色对象 
      
       */ 
      
       private Color getRandColor(int ll, int ul){ 
      
       if (ll > 255) ll = 255; 
      
       if (ll < 1) ll = 1; 
      
       if (ul > 255) ul = 255; 
      
       if (ul < 1) ul = 1; 
      
       if (ul == ll) ul = ll + 1; 
      
       int r = random.nextInt(ul - ll) + ll; 
      
       int g = random.nextInt(ul - ll) + ll; 
      
       int b = random.nextInt(ul - ll) + ll; 
      
       Color color = new Color(r,g,b); 
      
       return color; 
      
       } 
      
      
       /** 
      
       * 生成指定字符串的图像数据 
      
       * @param verifyCode 即将被打印的随机字符串 
      
       * @return 生成的图像数据 
      
       * */ 
      
       private BufferedImage getImage(String verifyCode){ 
      
      
       BufferedImage image = new BufferedImage(WIDTH * CODE_LENGTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
      
      
       //获取图形上下文 
      
       Graphics graphics = image.getGraphics(); 
      
      
       //设置背景色 
      
       graphics.setColor(getRandColor(1,50)); 
      
       //填充背景色 
      
       graphics.fillRect(0, 0, WIDTH * 4, HEIGHT); 
      
      
       //设置边框颜色 
      
       graphics.setColor(new Color(0,255,0)); 
      
       //画边框 
      
       for (int i=0; i<2; i++) 
      
       graphics.drawRect(i, i, WIDTH * CODE_LENGTH - i * 2 - 1, HEIGHT - i * 2 - 1); 
      
      
       //设置随机干扰线条颜色 
      
       graphics.setColor(getRandColor(50,100)); 
      
       //产生50条干扰线条 
      
       for (int i=0; i<50; i++){ 
      
       int x1 = random.nextInt(WIDTH * CODE_LENGTH - 4) + 2; 
      
       int y1 = random.nextInt(HEIGHT - 4) + 2; 
      
       int x2 = random.nextInt(WIDTH * CODE_LENGTH - 2 - x1) + x1; 
      
       int y2 = y1; 
      
       graphics.drawLine(x1, y1, x2, y2); 
      
       } 
      
      
       //设置字体 
      
       graphics.setFont(new Font("Times New Roman", Font.PLAIN, 18)); 
      
       //画字符串 
      
       for (int i=0; i<this.CODE_LENGTH; i++){ 
      
       String temp = verifyCode.substring(i, i+1); 
      
       graphics.setColor(getRandColor(100,255)); 
      
       graphics.drawString(temp, 13 * i + 6, 16); 
      
       }
      
    
    
    
      //图像生效 
      
       graphics.dispose(); 
      
      
       return image; 
      
       } 
      
      
       /** 
      
       * 将验证码的图像输出 
      
       * @param request 用户的请求对象 
      
       * @param response 用户的响应对象 
      
       * */ 
      
       public void printImage(HttpServletRequest request, 
      
       HttpServletResponse response){ 
      
       //将ContentType设为"image/jpeg",让浏览器识别图像格式。 
      
       response.setContentType("image/jpeg"); 
      
       //设置页面不缓存 
      
       response.setHeader("Pragma", "No-cache"); 
      
       response.setHeader("Cache-Control", "no-cache"); 
      
       response.setDateHeader("Expires", 2000); 
      
      
       //获得随机验证码 
      
       String verifyCode = this.getRandString(); 
      
       String str = "ssss"; 
      
       for(int i=0; i<10; i++) 
      
       str = str + str; 
      
       //获得验证码的图像数据 
      
       BufferedImage bi = this.getImage(verifyCode); 
      
       //把验证码存入session 
      
       request.getSession().setAttribute(ATTRIBUTE_NAME, verifyCode); 
      
       try{ 
      
       //获得Servlet输出流 
      
       ServletOutputStream outStream = response.getOutputStream(); 
      
       //创建可用来将图像数据编码为JPEG数据流的编码器 
      
       JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outStream); 
      
       //将图像数据进行编码 
      
       encoder.encode(bi); 
      
       //强行将缓冲区的内容输入到页面 
      
       outStream.flush(); 
      
       //关闭输出流 
      
       outStream.close(); 
      
       }catch(IOException ex){ 
      
       ex.printStackTrace(); 
      
       } 
      
       } 
      
      
       /** 
      
       * 检查输入的验证码是否正确,若用户输入的验证码与生成的验证码相符则返回true,否则返回false。 
      
       * @param request 用户的请求对象 
      
       * @return 验证结果 
      
       * */ 
      
       public boolean check(HttpServletRequest request){ 
      
       if (((String)request.getParameter(ATTRIBUTE_NAME)) 
      
       .equalsIgnoreCase((String)request.getSession().getAttribute(ATTRIBUTE_NAME))){ 
      
       request.getSession().removeAttribute(ATTRIBUTE_NAME); 
      
       return true; 
      
       } 
      
       return false; 
      
       } 
      
       }<wbr></wbr>
      
         <wbr></wbr>
      
      <wbr></wbr>
       
      
    
    /**此代码为深秋小雨所编写,来自J道**/ 
    
    
    ==================================================================
    
    摘自【http://www.blogjava.net/wuxingjia/archive/2008/04/05/190893.html】 
  
  
     <!-- Google Reader shared发布代码开始 --> <script type="text/javascript" src="http://www.google.com/reader/ui/publisher.js"></script><script type="text/javascript" src="http://www.google.com/reader/public/javascript/user/00697638153916680411/state/com.google/broadcast?n=5&callback=GRC_p(%7Bc%3A%22green%22%2Ct%3A%22%5Cu8FD9%5Cu4E9B%5Cu6587%5Cu7AE0%5Cu4E5F%5Cu503C%5Cu5F97%5Cu4E00%5Cu770B%22%2Cs%3A%22false%22%7D)%3Bnew%20GRC"></script><!-- Google Reader shared发布代码结束 -->
  
  
    
      纯JAVA技术验证码生成器(服务器端servlet实现)
    
  
 	
	
	
	
	
			
	
		
			
				
					更多文章、技术交流、商务合作、联系博主
					
						微信扫码或搜索:z360901061
					
					
					
						微信扫一扫加我为好友
						
							QQ号联系:  360901061
						
					 
				 
			 
		 
	 
	
		
			
				
					您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。
					
						【本文对您有帮助就好】元