浏览 12922 次
锁定老帖子 主题:Struts 验证图片。
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-05-12
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="请输入此验证码,如看不清请点击刷新。" style="cursor:pointer" />
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-07-08
问题:点击图片后无法刷新
|
|
返回顶楼 | |
发表时间:2008-07-08
无法刷新你就在this.src='/validatecode.do'后面加上一个随机数不就好了吗
比如this.src='/validatecode.do?'+random(),我忘记随机数怎么写了 暂时就这么代替了 |
|
返回顶楼 | |
发表时间:2008-07-09
楼主写得不错,我也有一个检证码的写法,不过是用spring MVC的,参考如下:
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); } } } |
|
返回顶楼 | |
发表时间:2008-07-09
我比较懒,直接用开源的JCAPTCHA做图片认证。简单方便,而且产生的图片连人都要花时间去辨认,别说用软件了。。
|
|
返回顶楼 | |
发表时间:2008-07-09
又见session,对扩展一点好处都没有。
|
|
返回顶楼 | |