Struts 2版驗證碼

1.創建驗證碼工具類

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
 * createImage方法返回一個Map類型,Map的key是所生產的驗證碼的字符串 Map的value是所生產的BufferImage類型的驗證碼
 * getInputStream方法將BufferImage轉成InputStream類型
 */
public class ValidateCode {
    private static final char[] chars = { '0', '1', '2', '3', '4', '5', '6',
            '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
            'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
            'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
            'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
            'X', 'Y', 'Z' };
    private static final int SIZE = 4; // 字符數
    private static final int LINES = 12; // 干擾線數量
    private static final int WIDTH = 150; // 生成的驗證碼圖片的寬度
    private static final int HEIGHT = 80; // 生成的驗證碼圖片的長度
    private static final int FONT_SIZE = 50; // 字體大小
    public static Map<String, BufferedImage> createImage() {
        // 用戶保存字符串
        StringBuffer sb = new StringBuffer();
        // BufferImage類型的驗證碼
        BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
                BufferedImage.TYPE_INT_RGB);
        // 獲得畫筆
        Graphics g = image.getGraphics();
        g.setColor(Color.LIGHT_GRAY); // 設置背景色
        g.fillRect(0, 0, WIDTH, HEIGHT);// 將背景色填充到圖片中
        Random ran = new Random(); // 獲得一個Random對象
        // 畫字符
        for (int i = 1; i <= SIZE; i++) {
            int r = ran.nextInt(chars.length); // 得到一個隨機的下標, chars
                                                // 是保存着若干字符的char字符
            g.setColor(getRandomColor()); // 得到一個隨機的顏色
            g.setFont(new Font(null, Font.BOLD + Font.ITALIC, FONT_SIZE)); // 設置字體大小
            g.drawString(chars[r] + "", (i - 1) * WIDTH / SIZE,
                    (int) (HEIGHT * 0.7)); // 畫字符
            sb.append(chars[r]);
        }
        // 畫干擾線
        for (int i = 1; i <= LINES; i++) {
            g.setColor(getRandomColor()); // 同樣,干擾線也是用隨機的顏色
            g.drawLine(ran.nextInt(WIDTH), ran.nextInt(HEIGHT),
                    ran.nextInt(WIDTH), ran.nextInt(HEIGHT));// 隨機設置干擾線的方向
        }
        // 將圖片中的字符串保存爲Map對象的key,BufferedImage保存爲value
        Map<String, BufferedImage> map = new HashMap<String, BufferedImage>();
        map.put(sb.toString(), image);
        return map;
    }
    /**
     * 獲得一個隨機的顏色 返回 Color對象
     * 
     * @return
     */
    private static Color getRandomColor() {
        Random ran = new Random();
        Color color = new Color(ran.nextInt(256), ran.nextInt(256),
                ran.nextInt(256));
        return color;
    }
    /**
     * 將 BufferImage轉成InputStream類型
     * 
     * @param image
     * @return
     * @throws IOException
     */
    public static InputStream getInputStream(BufferedImage image)
            throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);
        encoder.encode(image);
        byte[] imageBts = bos.toByteArray();
        InputStream in = new ByteArrayInputStream(imageBts);
        return in;
    }
}

2.創建驗證碼action

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import cn.hr.util.ValidateCode;
/**
 * 隨機驗證碼
 */
public class ValidateCodeAction {
    private InputStream imageStream;
    public InputStream getImageStream() {
        return imageStream;
    }
    public void setImageStream(InputStream imageStream) {
        this.imageStream = imageStream;
    }
    public String execute() throws IOException {
        Map<String, BufferedImage> map = ValidateCode.createImage();
        String key = map.keySet().iterator().next();
        BufferedImage image = map.get(key);
        imageStream = ValidateCode.getInputStream(image);
        return "success";
    }
}

3.配置struts.xml

<package name="validateCode" extends="struts-default" namespace="/">
    <action name="image" class="完全限定名">
        <!-- 
            若是S2SH集成版,完全限定名要改爲相應bean的id屬性的值
            inputName是固定寫法, 目的是給這種類型的Result對象的inputName屬性賦值.
            imageStream是Action裏的輸出屬性名, 這個輸出屬性是InputStream類型的
        -->
        <result type="stream">
            <param name="inputName">imageStream</param>
        </result>
    </action>
</package>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章