Struts 验证图片。
package cn.com.lough.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;/** * MyEclipse Struts Creation date: 01-11-2007 * * XDoclet definition: * * @struts.action validate="true" */public class ValidatecodeAction extends Action {/* * Generated Methods *//** * Method execute * * @param mapping * @param form * @param request * @param response * @return ActionForward */public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {try {int width = 50;int height = 18;// 取得一个4位随机字母数字字符串String s = RandomStringUtils.random(4, true, true);// 保存入session,用于与用户的输入进行比较.// 注意比较完之后清除session.HttpSession session = request.getSession(true);session.setAttribute("validateCode", s);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();// 设定背景色g.setColor(getRandColor(200, 250));g.fillRect(0, 0, width, height);// 设定字体Font mFont = new Font("Times New Roman", Font.BOLD, 18);// 设置字体g.setFont(mFont);// 画边框// g.setColor(Color.BLACK);// g.drawRect(0, 0, width - 1, height - 1);// 随机产生干扰线,使图象中的认证码不易被其它程序探测到g.setColor(getRandColor(160, 200));// 生成随机类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);}// 将认证码显示到图象中g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));g.drawString(s, 2, 16);// 图象生效g.dispose();// 输出图象到页面ImageIO.write((BufferedImage) image, "JPEG", out);out.close();} catch (Exception e) {e.printStackTrace();}return null;}private Color getRandColor(int fc, int bc) { // 给定范围获得随机颜色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);}}jsp页面的调用 <html:img page="/validatecode.do" border="0" onclick="this.src='/validatecode.do'" alt="Struts 应验图片" style="cursor:pointer" />
?
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;public final class ImageCode {private static final Random random = new Random();private static final Font[] CODEFONT = { new Font("宋体", Font.BOLD, 25), new Font("宋体", Font.BOLD, 25), new Font("宋体", Font.BOLD, 25),new Font("宋体", Font.BOLD, 25) };private static final Color[] FONTCOLOR = { Color.ORANGE, Color.RED, Color.PINK, Color.BLUE, Color.GREEN };private static final Color[] BGCOLOR = { Color.BLACK, Color.WHITE };private static final Color LINECOLOR = new Color(242, 234, 22);private static final String[] CODE = { "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" };private static StringBuffer CONDENUMBER = null;private static final int WIDTH = 100, HEIGHT = 25;public final String image(HttpServletRequest request, HttpServletResponse response) {CONDENUMBER = new StringBuffer();BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);Graphics g = image.getGraphics();g.setColor(BGCOLOR[random.nextInt(2)]);g.fillRect(0, 0, WIDTH, HEIGHT);for (int i = 0; i < 4; i++) {drawCode(g, i);}drawNoise(g, 8);g.setColor(Color.gray);g.drawRect(0, 0, WIDTH - 1, HEIGHT - 1);g.dispose();response.setHeader("Pragma", "No-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);response.setContentType("image/png");ServletOutputStream sos = null;try {sos = response.getOutputStream();ImageIO.write(image, "png", sos);sos.flush();sos.close();} catch (Exception e) {e.printStackTrace();return null;}return CONDENUMBER.toString();}private final void drawCode(Graphics graphics, int i) {String number = CODE[random.nextInt(36)];graphics.setFont(CODEFONT[random.nextInt(4)]);graphics.setColor(FONTCOLOR[random.nextInt(5)]);graphics.drawString(number, 10 + i * 20, 20);CONDENUMBER.append(number);}private final void drawNoise(Graphics graphics, int lineNumber) {graphics.setColor(LINECOLOR);int pointX1, pointY1, pointX2, pointY2;for (int i = 0; i < lineNumber; i++) {pointX1 = 1 + (int) (Math.random() * WIDTH);pointY1 = 1 + (int) (Math.random() * HEIGHT);pointX2 = 1 + (int) (Math.random() * WIDTH);pointY2 = 1 + (int) (Math.random() * HEIGHT);graphics.drawLine(pointX1, pointY1, pointX2, pointY2);}}} 5 楼 suke 2008-07-09 我比较懒,直接用开源的JCAPTCHA做图片认证。简单方便,而且产生的图片连人都要花时间去辨认,别说用软件了。。 6 楼 neptune 2008-07-09 又见session,对扩展一点好处都没有。