首页 > Java开发 > Java Web验证码

Java Web验证码

1 验证码生成类RandomCode

RandomCode是一个生成验证码的工具类,支持英文和数字验证码,验证码包括英文大小写和数组,其中英文i、o和数字0、1因为容易产生混淆,不包括在生成验证码中。RandomCode支持输出jpg/bmp/png/gif图片格式的验证码。

[java]

  1. /** 
  2.  * RandomCode验证码可以通过静态方法和实例方法生成。 
  3.  *  
  4.  * 静态方法: 
  5.  *  
  6.  * //生成长度为4的随机验证码 
  7.  * String code = RandomCode.randomString(4); 
  8.  *  
  9.  * //把验证码图片输入到response输出流中 
  10.  * //图片格式jpg 
  11.  * OutputStream os = response.getOutputStream(); 
  12.  * RandomCode.write(code, 120, 30, os, "jpg"); 
  13.  *  
  14.  * 实例方法: 
  15.  *  
  16.  * //实例化验证码类 
  17.  * RandomCode rc = new RandomCode(4); 
  18.  *  
  19.  * //把验证码图片输入到response输出流中 
  20.  * //图片格式jpg 
  21.  * OutputStream os = response.getOutputStream(); 
  22.  * rc.write(120, 30, os, "jpg"); 
  23.  *  
  24.  * //获取验证码字符串 
  25.  * String code = rc.getCode(); 
  26.  * 
  27.  */  
  28. public class RandomCode {  
  29.     /** 
  30.      * 随机验证码字符 
  31.      */  
  32.     private static String base = "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789";  
  33.       
  34.     /** 
  35.      * 随机验证码长度 
  36.      */  
  37.     private int length = 4;  
  38.       
  39.     /** 
  40.      * 验证码字符串 
  41.      */  
  42.     private String code;  
  43.   
  44.     /** 
  45.      * 4位随机验证码 
  46.      */  
  47.     public RandomCode(){  
  48.         this.code = RandomCode.randomString(this.length);  
  49.     }  
  50.       
  51.     public RandomCode(int length){  
  52.         if(length > 0){  
  53.             this.length = length;  
  54.         }  
  55.           
  56.         this.code = RandomCode.randomString(this.length);  
  57.     }  
  58.       
  59.     /** 
  60.      * 生成验证码图片 
  61.      * @param width 图片宽度 
  62.      * @param height 图片高度 
  63.      * @return 
  64.      */  
  65.     public BufferedImage toImage(int width, int height){  
  66.         return RandomCode.toImage(this.code, width, height);  
  67.     }  
  68.       
  69.     /** 
  70.      * 输出验证码图片,默认图片格式jpeg 
  71.      * @param width 
  72.      * @param height 
  73.      * @param os 
  74.      * @throws IOException 
  75.      */  
  76.     public void write(int width, int height, OutputStream os) throws IOException{  
  77.         RandomCode.write(code, width, height, os, "jpeg");  
  78.     }  
  79.       
  80.     /** 
  81.      * 输出验证码图片 
  82.      * @param width 
  83.      * @param height 
  84.      * @param os 
  85.      * @param format 图片格式,支持jpg/jpeg/bmp/gif/png 
  86.      * @throws IOException 
  87.      */  
  88.     public void write(int width, int height, OutputStream os, String format) throws IOException{  
  89.         RandomCode.write(code, width, height, os, format);  
  90.     }  
  91.   
  92.     public int getLength() {  
  93.         return length;  
  94.     }  
  95.       
  96.     public String getCode() {  
  97.         return code;  
  98.     }  
  99.       
  100.     /** 
  101.      * 静态方法 
  102.      * 生成随机字符串 
  103.      * @param length 字符串长度 
  104.      * @return 随机字符串 
  105.      */  
  106.     public static String randomString(int length){  
  107.         Random random = new Random();  
  108.         StringBuffer sb = new StringBuffer();  
  109.         for(int i = 0; i < length; i++){  
  110.             sb.append(base.charAt(random.nextInt(base.length())));  
  111.         }  
  112.         return sb.toString();  
  113.     }  
  114.       
  115.     /** 
  116.      * 静态方法 
  117.      * 输出验证码图片 
  118.      * @param code 验证码字符串 
  119.      * @param width 图片宽度 
  120.      * @param height 图片高度 
  121.      * @param os 图片输出流 
  122.      * @param format 图片格式,支持jpg/jpeg/bmp/gif/png 
  123.      * @throws IOException 
  124.      */  
  125.     public static void write(String code, int width, int height, OutputStream os, String format) throws IOException{  
  126.         BufferedImage image = toImage(code, width, height);  
  127.         ImageIO.write(image, format, os);  
  128.     }  
  129.       
  130.     /** 
  131.      * 静态方法 
  132.      * 输出验证码图片,默认图片格式jpeg 
  133.      * @param code 验证码字符串 
  134.      * @param width 图片宽度 
  135.      * @param height 图片高度 
  136.      * @param os 图片输出流 
  137.      * @throws IOException 
  138.      */  
  139.     public static void write(String code, int width, int height, OutputStream os) throws IOException{  
  140.         write(code, width, height, os, "jpeg");  
  141.     }  
  142.       
  143.     /** 
  144.      * 静态方法 
  145.      * 字符串转成验证码图片 
  146.      * @param code 验证码字符串 
  147.      * @param width 验证码图片宽度,单位像素 
  148.      * @param height 验证码图片高度,单位像素 
  149.      * @return 
  150.      */  
  151.     public static BufferedImage toImage(String code, int width, int height){  
  152.         //字体大小  
  153.         int fontSize = (int)Math.ceil(height * 0.9);  
  154.         if(fontSize < 20){  
  155.             fontSize = 20;  
  156.         }  
  157.           
  158.         //字体在Y坐标上的位置  
  159.         int positionY = (int)Math.ceil(height * 0.8);  
  160.           
  161.         int lenCode = code.length();  
  162.           
  163.         //计算字体宽度  
  164.         int fontWidth = width / (lenCode + 2);  
  165.           
  166.         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);  
  167.         Graphics g = image.getGraphics();  
  168.           
  169.         //图片背景随机颜色  
  170.         g.setColor(randomColor(new Random(), 200250));  
  171.         g.fillRect(00, width, height);  
  172.           
  173.         //设置字体  
  174.         g.setFont(new Font("Times New Roman", Font.BOLD, fontSize));  
  175.           
  176.         //在图片上画纵横交错的线,达到混淆效果  
  177.         drawLines(g, width, height);  
  178.           
  179.         //在图片上画验证码  
  180.         drawString(g, code, fontWidth, positionY);  
  181.           
  182.         g.dispose();  
  183.           
  184.         return image;  
  185.     }  
  186.       
  187.     /** 
  188.      * 静态方法 
  189.      * 在图片上话位子 
  190.      * @param g 
  191.      * @param code 验证码字符串 
  192.      * @param fontWidth 字体宽度 
  193.      * @param positionY 字体Y坐标 
  194.      */  
  195.     private static void drawString(Graphics g, String code, int fontWidth, int positionY){  
  196.         int len = code.length();  
  197.         Random random = new Random();  
  198.         for(int i = 0; i < len; i++){  
  199.             g.setColor(randomColor(random));  
  200.             g.drawString(String.valueOf(code.charAt(i)), (i + 1) * fontWidth, positionY);  
  201.         }  
  202.     }  
  203.       
  204.     private static Color randomColor(Random random){  
  205.         int r = random.nextInt(255);  
  206.         int g = random.nextInt(255);  
  207.         int b = random.nextInt(255);  
  208.         return new Color(r, g, b);  
  209.     }  
  210.       
  211.     private static Color randomColor(Random random, int fc, int bc){  
  212.         if(fc > 255){  
  213.             fc = 255;  
  214.         }  
  215.               
  216.         if(bc > 255){  
  217.             bc = 255;  
  218.         }     
  219.           
  220.         int diff = bc-fc;  
  221.         int r = fc + random.nextInt(diff);  
  222.         int g = fc + random.nextInt(diff);  
  223.         int b = fc + random.nextInt(diff);  
  224.         return new Color(r,g,b);  
  225.     }  
  226.       
  227.     /** 
  228.      * 静态方法 
  229.      * 画纵横交错的线 
  230.      * @param g 
  231.      * @param width 验证码图片宽度 
  232.      * @param height 验证码图片高度 
  233.      */  
  234.     private static void drawLines(Graphics g, int width, int height){  
  235.         Random random = new Random();  
  236.           
  237.         //线的数量  
  238.         int count = ((int)(Math.ceil(random.nextDouble() * 100))) + 100;          
  239.           
  240.         for(int i = 0; i < count; i++){  
  241.             int fc = 160 + (int)Math.ceil(random.nextDouble() * 40);  
  242.             int bc = 200 + (int)Math.ceil(random.nextDouble() * 55);  
  243.             g.setColor(randomColor(random, fc, bc));  
  244.               
  245.             int x = random.nextInt(width);  
  246.             int y = random.nextInt(height);  
  247.             int xl = random.nextInt(width / 5);  
  248.             int yl = random.nextInt(height / 5);              
  249.             g.drawLine(x, y, x + xl, y + yl);  
  250.         }  
  251.     }     
  252. }  

 

2 Servlet返回验证码

请求路径http://<网站路径>/random/code/servlet

[java]

  1. @WebServlet("/random/code/servlet")  
  2. public class RandomCodeServlet extends HttpServlet {  
  3.     private static final long serialVersionUID = 1L;  
  4.   
  5.     protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  6.         // 验证码图片宽度,单位像素  
  7.         int width = 120;  
  8.         // 验证码图片高度,单位像素  
  9.         int height = 30;  
  10.         // 验证码图片格式  
  11.         String format = "png";  
  12.         // 验证码字符长度  
  13.         int len = 4;  
  14.   
  15.         // 设置图片格式  
  16.         response.setContentType("image/" + format);  
  17.   
  18.         // 禁止浏览器缓存图片  
  19.         response.setHeader("Pragma""no-cache");  
  20.         response.setHeader("Cache-Control""no-cache");  
  21.         response.setDateHeader("Expires"0);  
  22.   
  23.         String code = RandomCode.randomString(len);  
  24.   
  25.         // 把图片输出到response输出流  
  26.         RandomCode.write(code, width, height, response.getOutputStream(), format);  
  27.     }  
  28. }  

 

3 Strust2返回验证码

[java]

  1. public class RandomCodeAction extends ActionSupport {  
  2.     private static final long serialVersionUID = -7515645222798283236L;  
  3.   
  4.     /** 
  5.      * 获取验证码 
  6.      */  
  7.     public void generateCode() {  
  8.         HttpServletResponse response = ServletActionContext.getResponse();  
  9.   
  10.         // 验证码图片宽度,单位像素  
  11.         int width = 120;  
  12.         // 验证码图片高度,单位像素  
  13.         int height = 30;  
  14.         // 验证码图片格式  
  15.         String format = "png";  
  16.         // 验证码字符长度  
  17.         int len = 4;  
  18.   
  19.         // 设置图片格式  
  20.         response.setContentType("image/" + format);  
  21.   
  22.         // 禁止浏览器缓存图片  
  23.         response.setHeader("Pragma""no-cache");  
  24.         response.setHeader("Cache-Control""no-cache");  
  25.         response.setDateHeader("Expires"0);  
  26.   
  27.         String code = RandomCode.randomString(len);  
  28.   
  29.         // 把图片输出到response输出流  
  30.         try {  
  31.             RandomCode.write(code, width, height, response.getOutputStream(), format);  
  32.         } catch (IOException e) {  
  33.             e.printStackTrace();  
  34.         }  
  35.     }  
  36. }  

Struts2的验证码配置

[html]

  1. <package name="pkg-random-code" namespace="/" extends="struts-default">  
  2.     <action name="randomCode_*" method="{1}" class="com.rhui.web.action.RandomCodeAction"></action>  
  3. </package>  

请求路径http://<网站路径>/randomCode_generateCode.do

 

4 SpringMVC返回验证码

请求路径http://<网站路径>/random/code/generate.do

[java]

  1. package com.rhui.web.controller;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.http.HttpServletResponse;  
  6.   
  7. import org.springframework.stereotype.Controller;  
  8. import org.springframework.web.bind.annotation.RequestMapping;  
  9.   
  10. import com.rhui.util.RandomCode;  
  11.   
  12. @Controller  
  13. @RequestMapping("/random/code")  
  14. public class RandomCodeController {  
  15.     @RequestMapping("/generate.do")  
  16.     public void generateCode(HttpServletResponse response) {  
  17.         // 验证码图片宽度,单位像素  
  18.         int width = 120;  
  19.         // 验证码图片高度,单位像素  
  20.         int height = 30;  
  21.         // 验证码图片格式  
  22.         String format = "png";  
  23.         // 验证码字符长度  
  24.         int len = 4;  
  25.   
  26.         // 设置图片格式  
  27.         response.setContentType("image/" + format);  
  28.   
  29.         // 禁止浏览器缓存图片  
  30.         response.setHeader("Pragma""no-cache");  
  31.         response.setHeader("Cache-Control""no-cache");  
  32.         response.setDateHeader("Expires"0);  
  33.   
  34.         String code = RandomCode.randomString(len);  
  35.   
  36.         // 把图片输出到response输出流  
  37.         try {  
  38.             RandomCode.write(code, width, height, response.getOutputStream(), format);  
  39.         } catch (IOException e) {  
  40.             e.printStackTrace();  
  41.         }  
  42.     }  
  43. }  



本文固定链接: http://www.devba.com/index.php/archives/6279.html | 开发吧

报歉!评论已关闭.