<div id="authCode"> <input type="image" src="rand.action" onclick="changeValidateCode(this)"/> </div>
<script type="text/javascript"> function changeValidateCode(obj) { var currentTime= new Date().getTime(); obj.src = "rand.action?d=" + currentTime; } </script>
<package name="randpicture" extends="struts-default"> <action name="rand" class="produceAuthCode"> <result type="stream"> <param name="contentType">image/jpeg</param> <param name="inputName">inputStream</param> </result> </action> </package>
package com.demo.action; 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; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; /** * * 生成验证码ACTION * * * */ public class ProduceAuthCode extends ActionSupport { private static final long serialVersionUID = 1L; private ByteArrayInputStream inputStream; public ByteArrayInputStream getInputStream() { return inputStream; } public void setInputStream(ByteArrayInputStream inputStream) { this.inputStream = inputStream; } @Override public String execute() throws Exception { // TODO Auto-generated method stub //在内存中创建对象 int width=85; int height=20; BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //获取图形上下文 Graphics g=image.getGraphics(); //生成随即类 Random random=new Random(); //设定背景色 g.setColor(getRandColor(200,250)); g.fillRect(0, 0, width, height); //设定字体 g.setFont(new Font("Times New Roman", Font.PLAIN, 18)); //随即产生155条干扰线,使图像中的验证码不易被其他程序探测到 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); } //去随机产生的验证码(6位数字) String sRand=""; for(int i=0;i<6;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, 13*i+6, 16); } //将验证码放入session ActionContext.getContext().getSession().put("rand", sRand); //图像生成 g.dispose(); ByteArrayOutputStream output=new ByteArrayOutputStream(); ImageOutputStream imageOut=ImageIO.createImageOutputStream(output); ImageIO.write(image, "JPEG", imageOut); imageOut.close(); ByteArrayInputStream input=new ByteArrayInputStream(output.toByteArray()); this.setInputStream(input); return "success"; } //给定范围获得随即颜色 private Color getRandColor(int fc, int bc) { // TODO Auto-generated method stub Random random=new Random(); if(fc>255)fc=255; if(bc>255)fc=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); } }
ActionContext ctx=ActionContext.getContext(); if(!CheckingCode.equals(ctx.getSession().get("rand"))){ ctx.put("Msg", "验证码有误!"); return "error"; }