java验证码

[java]  view plain copy
  1. package cn.edu.pdsu.action;  
  2.   
  3. import java.awt.Color;  
  4. import java.awt.Font;  
  5. import java.awt.Graphics;  
  6. import java.awt.image.BufferedImage;  
  7. import java.util.Random;  
  8.   
  9. import javax.imageio.ImageIO;  
  10. import javax.servlet.ServletOutputStream;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13. import javax.servlet.http.HttpSession;  
  14.   
  15. import org.apache.commons.lang.RandomStringUtils;  
  16. import org.apache.struts2.ServletActionContext;  
  17.   
  18. /** 
  19.  * 类说明:验证码类(将验证码信息写入到session中 属性“authCode”) 
  20.  *  
  21.  * @author 作者: LiuJunGuang 
  22.  * @version 创建时间:2011-7-17 下午03:26:21 
  23.  */  
  24. public class AuthCodeAction {  
  25.     private HttpServletResponse response = ServletActionContext.getResponse();  
  26.     private HttpServletRequest request = ServletActionContext.getRequest();  
  27.   
  28.     public String execute() {  
  29.         try {  
  30.             int width = 50;  
  31.             int height = 20;  
  32.             // 取得一个4位随机字母数字字符串  
  33.             String s = RandomStringUtils.random(4truetrue);  
  34.   
  35.             // 保存入session,用于与用户的输入进行比较.  
  36.             // 注意比较完之后清除session.  
  37.             HttpSession session = request.getSession(true);  
  38.             session.setAttribute("authCode", s);  
  39.   
  40.             response.setContentType("images/jpeg");//告知浏览器内容的类型  
  41.             response.setHeader("Pragma""No-cache");//HTTP 1.0版 不要缓存  
  42.             response.setHeader("Cache-Control""no-cache"); //HTTP 1.1  不要缓存  
  43.             response.setDateHeader("Expires"0);//设置存活时间  
  44.   
  45.             ServletOutputStream out = response.getOutputStream();//得到响应输出流  
  46.             BufferedImage image = new BufferedImage(width, height,  
  47.                     BufferedImage.TYPE_INT_RGB);  
  48.             Graphics g = image.getGraphics();  
  49.             // 设定背景色  
  50.             g.setColor(getRandColor(200250));  
  51.             g.fillRect(00, width, height);  
  52.   
  53.             // 设定字体  
  54.             Font mFont = new Font("Times New Roman", Font.BOLD, 18);// 设置字体  
  55.             g.setFont(mFont);  
  56.   
  57.             // 画边框  
  58.             // g.setColor(Color.BLACK);  
  59.             // g.drawRect(0, 0, width - 1, height - 1);  
  60.   
  61.             // 随机产生干扰线,使图象中的认证码不易被其它程序探测到  
  62.             g.setColor(getRandColor(160200));  
  63.             // 生成随机类  
  64.             Random random = new Random();  
  65.             for (int i = 0; i < 125; i++) {  
  66.                 int x2 = random.nextInt(width);  
  67.                 int y2 = random.nextInt(height);  
  68.                 int x3 = random.nextInt(12);  
  69.                 int y3 = random.nextInt(12);  
  70.                 g.drawLine(x2, y2, x2 + x3, y2 + y3);  
  71.             }  
  72.             // 绘制一些长的干扰线  
  73.             for (int i = 0; i < 5; i++) {  
  74.                 int y1 = random.nextInt(15) + 3;  
  75.                 g.drawLine(0, y1, width, y1);  
  76.                 g.setColor(getRandColor(10160));  
  77.             }  
  78.   
  79.             // 将认证码显示到图象中  
  80.             g.setColor(new Color(20 + random.nextInt(110), 20 + random  
  81.                     .nextInt(110), 20 + random.nextInt(110)));  
  82.   
  83.             g.drawString(s, 216);  
  84.   
  85.             // 图象生效  
  86.             g.dispose();  
  87.             // 输出图象到页面  
  88.             ImageIO.write((BufferedImage) image, "JPEG", out);//将图片以JPEG格式输出到out输出流中  
  89.             out.close();  
  90.         } catch (Exception e) {  
  91.             e.printStackTrace();  
  92.         }  
  93.         return null;  
  94.     }  
  95.   
  96.     //获得某一范围的随机颜色  
  97.     private Color getRandColor(int fc, int bc) { // 给定范围获得随机颜色  
  98.         Random random = new Random();  
  99.         if (fc > 255)  
  100.             fc = 255;  
  101.         if (bc > 255)  
  102.             bc = 255;  
  103.         int r = fc + random.nextInt(bc - fc);  
  104.         int g = fc + random.nextInt(bc - fc);  
  105.         int b = fc + random.nextInt(bc - fc);  
  106.         return new Color(r, g, b);  
  107.     }  
  108. }  

你可能感兴趣的:(java验证码)