Jquery+Struts2无刷新验证码

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);
	});
});



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值