jQuery+Struts2无刷新验证码
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);
- });
- });
评论暂时关闭