struts2实现图片验证码

时间:2022-12-30 18:11:07

生成图片验证码的主要工具类方法为:

  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         // 取随机产生的认证码(4位字符)
 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