1.产生图片的工厂:(参考网上的)
package org.blog.util; 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.util.Random; import javax.imageio.ImageIO; import javax.imageio.stream.ImageOutputStream; public class RandomNumUtil { private ByteArrayInputStream image; private String str; public RandomNumUtil() { init(); } public static RandomNumUtil Instance() { return new RandomNumUtil(); } public ByteArrayInputStream getImage() { return this.image; } public String getString() { return this.str; } private void init() { //在内存中创建图象 int width = 109; int height = 40; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); /* 获取内在中图像的上下文 */ Graphics g = image.getGraphics(); /* 创建一个随机类 */ Random random = new Random(); /* 设置背景颜色 */ g.setColor(this.getRandColor(200, 250)); g.fillRect(0, 0, width, height); /* 设置字体 */ g.setFont(new Font("Times New Roman", Font.PLAIN, 28)); /* 设置干扰线的颜色 */ g.setColor(getRandColor(160, 200)); for (int i=0; i<155; i++) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(12); int yl = random.nextInt(12); g.drawLine(x, y, x+xl, y+yl); } /* 用来临时保存随机产生的数字 */ String sRand = ""; for (int i=0; i<4; i++) { String rand = String.valueOf(random.nextInt(10)); sRand += rand; g.setColor(new Color(20 + random.nextInt(110), 20+random.nextInt(110), 20+random.nextInt(110) )); g.drawString(rand, 20*i+10, 25); /* 然后赋给str */ this.str = sRand; } /* 使图像生效 */ g.dispose(); ByteArrayInputStream input = null; ByteArrayOutputStream output = new ByteArrayOutputStream(); try { ImageOutputStream imageOutput = ImageIO.createImageOutputStream(output); ImageIO.write(image, "JPEG", imageOutput); imageOutput.close(); input = new ByteArrayInputStream(output.toByteArray()); } catch (Exception e) { System.out.println("验证码图片产生出现错误:"+e.toString()); } this.image = input; } /* 随机产生颜色 */ 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); } }
2.通过Action获取该图片:
package org.blog.admin.action; import java.io.ByteArrayInputStream; import org.blog.util.RandomNumUtil; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class GetRandomNum extends ActionSupport { private static final long serialVersionUID = 1L; private ByteArrayInputStream inputStream; public ByteArrayInputStream getInputStream() { return inputStream; } public void setInputStream(ByteArrayInputStream inputStream) { this.inputStream = inputStream; } public String execute() throws Exception { RandomNumUtil randomNumUtil = RandomNumUtil.Instance(); this.setInputStream(randomNumUtil.getImage()); ActionContext.getContext().getSession().put("validateCode", randomNumUtil.getString()); return SUCCESS; } }
3.在strus.xml中配置:
<!-- 获取随机产生的数字验证码 --> <action name="getRandomNumber" class="org.blog.admin.action.GetRandomNum"> <result type="stream"> <param name="contentType">image/jpeg</param> <param name="inputName">inputStream</param> </result> </action>
4.在jsp文件中:
<img src="getRandomNumber" width="90" height="25" alt="验证码图片" id="randomCode"/> <a href="#" id="refresh" style="font-size:12px;">看不楚,换张图片</a>
5.局部刷新验证码的js代码:(主要的思想是让图片的src属性,通过js来每次重新加载一次action.可以通过产生随机数或以当前时间为种子,这样每次都去重新读取产生图片的Action了)
$(function() { $("#refresh").click(function() { var rom = new Date(); $("#randomCode").attr("src", "getRandomNumber?timestamp="+rom); }); });