——本文摘至互聯(lián)網(wǎng)——

產(chǎn)生4個(gè)驗(yàn)證碼的ACTION:

————ValidateCodeAction.java————

package org.struts.action;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.commons.lang.RandomStringUtils;

public class ValidateCodeAction extends Action {
?public ActionForward execute(ActionMapping mapping, ActionForm form,
???HttpServletRequest request, HttpServletResponse response) {
??try {
???int width = 52;
???int height = 22;
???// 取得一個(gè)4位隨機(jī)字母數(shù)字字符串
???String code = RandomStringUtils.random(4, true, true);

???// 保存入session,用于與用戶的輸入進(jìn)行比較.
???// 注意比較完之后清除session.
???HttpSession session = request.getSession(true);
???session.setAttribute("code", code);

???response.setContentType("images/jpeg");
???response.setHeader("Pragma", "No-cache");
???response.setHeader("Cache-Control", "no-cache");
???response.setDateHeader("Expires", 0);

???ServletOutputStream out = response.getOutputStream();
???BufferedImage image = new BufferedImage(width, height,
?????BufferedImage.TYPE_INT_RGB);
???Graphics g = image.getGraphics();
???// 設(shè)定背景色
???g.setColor(getRandColor(200, 250));
???g.fillRect(0, 0, width, height);

???// 設(shè)定字體
???Font mFont = new Font("Times New Roman", Font.BOLD, 18);// 設(shè)置字體
???g.setFont(mFont);

???// 畫(huà)邊框
???// g.setColor(Color.BLACK);
???// g.drawRect(0, 0, width - 1, height - 1);

???// 隨機(jī)產(chǎn)生干擾線,使圖象中的認(rèn)證碼不易被其它程序探測(cè)到
???g.setColor(getRandColor(160, 200));
???// 生成隨機(jī)類
???Random random = new Random();
???for (int i = 0; i < 155; i++) {
????int x2 = random.nextInt(width);
????int y2 = random.nextInt(height);
????int x3 = random.nextInt(12);
????int y3 = random.nextInt(12);
????g.drawLine(x2, y2, x2 + x3, y2 + y3);
???}

???// 將認(rèn)證碼顯示到圖象中
???g.setColor(new Color(20 + random.nextInt(110), 20 + random
?????.nextInt(110), 20 + random.nextInt(110)));

???g.drawString(code, 2, 16);

???// 圖象生效
???g.dispose();
???// 輸出圖象到頁(yè)面
???ImageIO.write((BufferedImage) image, "JPEG", out);
???out.close();
??} catch (Exception e) {
???e.printStackTrace();
??}
??return null;
?}

?private Color getRandColor(int fc, int bc) { // 給定范圍獲得隨機(jī)顏色
??Random random = new Random();
??if (fc > 255)
???fc = 255;
??if (bc > 255)
???bc = 255;
??int r = fc + random.nextInt(bc - fc);
??int g = fc + random.nextInt(bc - fc);
??int b = fc + random.nextInt(bc - fc);
??return new Color(r, g, b);
?}

}

struts-config.xml中配置:

?<action? path="/ValidateCode" type="org.struts.action.ValidateCodeAction" />?

JSP中調(diào)用的方法:

<html:img src="/ValidateCode.do" border="0"
????onclick="this.src.value='/ValidateCode.do'"
????alt="請(qǐng)輸入此驗(yàn)證碼,如看不清請(qǐng)點(diǎn)擊刷新。" style="cursor: pointer"/>