疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

struts2实现图片验证码


 

       struts2实现图片验证码
 
  生成图片验证码的主要工具类方法为:
 
  1 package com.yeting.fc.util;
 
  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.io.ByteArrayInputStream;
 
  8 import java.io.ByteArrayOutputStream;
 
  9 import java.util.Random;
 
  10
 
  11 import javax.imageio.ImageIO;
 
  12 import javax.imageio.stream.ImageOutputStream;
 
  13
 
  14 public class ImageCodeUtil {
 
  15     /**
 
  16      * 生成随机验证码字符串
 
  17      *
 
  18      * @return
 
  19      */
 
  20     public static String getImageCodeStr() {
 
  21
 
  22         Random random = new Random();
 
  23         String code[] = { "A", "a", "B", "b", "C", "c", "D", "d", "E", "e",
 
  24                 "F", "f", "G", "g", "H", "h", "I", "i", "J", "j", "K", "k",
 
  25                 "L", "l", "M", "m", "N", "n", "O", "o", "P", "p", "Q", "q",
 
  26                 "R", "r", "S", "s", "T", "t", "U", "u", "V", "v", "W", "w",
 
  27                 "X", "x", "Y", "y", "Z", "z", "0", "1", "2", "3", "4", "5",
 
  28                 "6", "7", "8", "9", "0", "1", "2", "3", "4", "5", "6", "7",
 
  29                 "8", "9", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
 
  30                 "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "1",
 
  31                 "2", "3", "4", "5", "6", "7", "8", "9", "0", "1" };
 
  32         // 取随机产生的认证码(6位数字)
 
  33         StringBuffer codeStr = new StringBuffer("");
 
  34         for (int i = 0; i < 4; i++) {
 
  35             String cStr = code[random.nextInt(104)];
 
  36             codeStr.append(cStr);
 
  37         }
 
  38         return codeStr.toString();
 
  39     }
 
  40
 
  41     /**
 
  42      * 生成带随机验证码的图片
 
  43      *
 
  44      * @param codeStr
 
  45      * @return
 
  46      */
 
  47     public static BufferedImage createImage(String codeStr) {
 
  48         int width = 60, height = 20;
 
  49         BufferedImage image = new BufferedImage(width, height,
 
  50                 BufferedImage.TYPE_INT_RGB);
 
  51         // 获取图形上下文
 
  52         Graphics g = image.getGraphics();
 
  53         // 生成随机类
 
  54         Random random = new Random();
 
  55         // 设定背景色
 
  56         g.setColor(getRandColor(200, 250));
 
  57         g.fillRect(0, 0, width, height);
 
  58         // 设定字体
 
  59         g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
 
  60         // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
 
  61         g.setColor(getRandColor(160, 200));
 
  62         for (int i = 0; i < 155; i++) {
 
  63             int x = random.nextInt(width);
 
  64             int y = random.nextInt(height);
 
  65             int xl = random.nextInt(12);
 
  66             int yl = random.nextInt(12);
 
  67             g.drawLine(x, y, x + xl, y + yl);
 
  68         }
 
  69         for (int i = 0; i < codeStr.length(); i++) {
 
  70             String cStr = codeStr.charAt(i) + "";
 
  71             g.setColor(new Color(random.nextInt(125), random.nextInt(125),
 
  72                     random.nextInt(125)));
 
  73             g.setFont(new Font("", Font.PLAIN, 20 + random.nextInt(5)));
 
  74             g.drawString(cStr, 15 * i + random.nextInt(5),
 
  75                     20 - random.nextInt(5));
 
  76         }
 
  77         g.dispose();
 
  78         return image;
 
  79     }
 
  80
 
  81     /**
 
  82      * 返回验证码图片的流格式
 
  83      *
 
  84      * @param codeStr
 
  85      * @return
 
  86      */
 
  87     public static ByteArrayInputStream getImageAsInputStream(String codeStr) {
 
  88         BufferedImage image = createImage(codeStr);
 
  89         return convertImageToStream(image);
 
  90     }
 
  91
 
  92     private static ByteArrayInputStream convertImageToStream(BufferedImage image) {
 
  93         ByteArrayInputStream inputStream = null;
 
  94         ByteArrayOutputStream output = null;
 
  95         ImageOutputStream imageOut = null;
 
  96         try {
 
  97             output = new ByteArrayOutputStream();
 
  98             imageOut = ImageIO.createImageOutputStream(output);
 
  99             ImageIO.write(image, "JPEG", imageOut);
 
  100             inputStream = new ByteArrayInputStream(output.toByteArray());
 
  101         } catch (Exception e) {
 
  102             e.printStackTrace();
 
  103         } finally{
 
  104             try {
 
  105                 if(imageOut!=null){
 
  106                     imageOut.close();
 
  107                 }
 
  108             } catch (Exception e2) {
 
  109                 e2.printStackTrace();
 
  110             }
 
  111         }
 
  112         return inputStream;
 
  113     }
 
  114
 
  115     /*
 
  116      * 给定范围获得随机颜色
 
  117      */
 
  118     private static Color getRandColor(int fc, int bc) {
 
  119         Random random = new Random();
 
  120         if (fc > 255)
 
  121             fc = 255;
 
  122         if (bc > 255)
 
  123             bc = 255;
 
  124         int r = fc + random.nextInt(bc - fc);
 
  125         int g = fc + random.nextInt(bc - fc);
 
  126         int b = fc + random.nextInt(bc - fc);
 
  127         return new Color(r, g, b);
 
  128     }
 
  129
 
  130 }
 
 Action中主要代码为:
 
  package com.yeting.fc.action;
 
  import java.io.ByteArrayInputStream;
 
  import com.opensymphony.xwork2.ActionContext;
 
  import com.opensymphony.xwork2.ActionSupport;
 
  import com.yeting.fc.util.ImageCodeUtil;
 
  public class ImageCodeAction extends ActionSupport{
 
  private static final long serialVersionUID = 1L;
 
  private ByteArrayInputStream inputStream;
 
  public String getImageCode() throws Exception{
 
  //获取图片字符串
 
  String codeStr = ImageCodeUtil.getImageCodeStr();
 
  ActionContext.getContext()。getSession()。put("rand",codeStr);
 
  //System.out.println(codeStr);
 
  inputStream = ImageCodeUtil.getImageAsInputStream(codeStr);
 
  return SUCCESS;
 
  }
 
  public void setInputStream(ByteArrayInputStream inputStream) {
 
  this.inputStream = inputStream;
 
  }
 
  public ByteArrayInputStream getInputStream() {
 
  return inputStream;
 
  }
 
  }
 
  struts.xml文件中配置如下:
 
  1 <!-- 验证码Action -->
 
  2    <action name="imageCode" class="imageCodeAction" method="getImageCode">
 
  3         <result type="stream">
 
  4             <param name="contentType">image/jpeg</param>
 
  5             <param name="inputName">inputStream</param>
 
  6         </result>
 
  7    </action>
 
  登陆页面:主要代码。
 
  1 <!--刷新请求,更换验证码内容。-->
 
  2 <script type="text/javascript">
 
  3     function imageCode(){
 
  4         document.getElementById("imageCode")。src="${pageContext.request.contextPath }/yeting/imageCode.action?st="+new Date();
 
  5     }
 
  6 </script>
 
  7
 
  8
 
  9
 
  10 <!--验证码主要html文件-->
 
  11
 
  12     验证码:<input style="width:50px;" type="text" name="imageCode"/>
 
  13           <a href="javascript:imageCode()">
 
  14                 <img style="margin-top: 5px;" id="imageCode" src="${pageContext.request.contextPath }/yeting/imageCode.action"/>
 
  15           </a>
 
  16           <a href="javascript:imageCode()"><input style="width:35px;" type="button" value="更换"/></a>
 
  17