struts2注解方式,验证码配置_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > struts2注解方式,验证码配置

struts2注解方式,验证码配置

 2014/4/9 12:33:04  zyengogo  程序员俱乐部  我要评论(0)
  • 摘要:<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><title>验证码</title><scripttype="text/javascript"src="/pro/thirdplug/jquery
  • 标签:配置 注解 方式 struts
class="jsp">
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
<title>验证码</title>
<script type="text/javascript" src="/pro/thirdplug/jquery-easyui/js/jquery-1.7.2.min.js"></script>

<script type="text/javascript">
$(function () {  
    //点击图片更换验证码
    $("#Verify").click(function(){
        $(this).attr("src","/pro/randcode/codeimage.action?timestamp="+new Date().getTime());
    });
});
</script>
  </head>
  
  <body>
    <img src="/pro/randcode/codeimage.action" id="Verify"  style="cursor:hand;" alt="看不清,换一张"/>
  </body>
</html>



package com.zyen.action.randcode;


import com.cpt.evn.util.randcodeutil.SecurityCode;
import com.cpt.evn.util.randcodeutil.SecurityImage;
import com.cpt.evn.util.randcodeutil.SecurityCode.SecurityCodeLevel;
import com.opensymphony.xwork2.ActionSupport;
import java.io.ByteArrayInputStream;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;

/**
 * 提供图片验证码
 * @version 1.0 
 * @author 
 */


@Results({
	@Result(name = "success", type="stream",params={"contentType", "image/jpeg", "inputName", "imageStream","bufferSize", "2048"}),
	@Result(name = "fail", location = "code.jsp")
})
public class CodeimageAction extends ActionSupport {
    //图片流
    private ByteArrayInputStream imageStream;

    
    
    public ByteArrayInputStream getImageStream() {
        return imageStream;
    }
    public void setImageStream(ByteArrayInputStream imageStream) {
        this.imageStream = imageStream;
    }

    
    
    /**
     * 验证码
     */
    public String execute() throws Exception {
        //获取默认难度和长度的验证码(Simple只包含数字,Medium包含数字和小写英文,Hard包含数字和大小写英文)
        String securityCode = SecurityCode.getSecurityCode(4, SecurityCodeLevel.Simple, false);
        imageStream = SecurityImage.getImageAsInputStream(securityCode);
        
        //放入session中
        HttpSession session = ServletActionContext.getRequest().getSession();  
        session.setAttribute("_CODE_", securityCode);
        
        return "success";
    }


}



package com.zyen.util.randcodeutil;

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.io.IOException;
import java.util.Random;
import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 * 工具类,生成验证码图片
 * 
 * @version 1.0 
 * @author 
 * 
 */
public class SecurityImage {

	/**
	 * 生成验证码图片
	 * 
	 * @param securityCode
	 *            验证码字符
	 * @return BufferedImage 图片
	 */
	public static BufferedImage createImage(String securityCode) {

		// 验证码长度
		int codeLength = securityCode.length();
		// 字体大小
		int fSize = 18;
		int fWidth = fSize + 1;
		// 图片宽度
		//int width = codeLength * fWidth + 6;
		// 图片高度
		//int height = fSize * 2 + 1;
		
		int width  = 73;
		int height = 21;
		

		// 图片
		BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
		Graphics g = image.createGraphics();

		// 设置背景色
		g.setColor(Color.WHITE);
		// 填充背景
		g.fillRect(0, 0, width, height);

		// 设置边框颜色
		g.setColor(Color.LIGHT_GRAY);
		// 边框字体样式
		g.setFont(new Font("Arial", Font.BOLD, height - 2));
		// 绘制边框
		g.drawRect(0, 0, width - 1, height - 1);

		// 绘制噪点
		Random rand = new Random();
		// 设置噪点颜色
		g.setColor(Color.LIGHT_GRAY);
		for (int i = 0; i < codeLength * 6; i++) {
			int x = rand.nextInt(width);
			int y = rand.nextInt(height);
			// 绘制1*1大小的矩形
			g.drawRect(x, y, 1, 1);
		}

		// 绘制验证码
		int codeY = height - 5;
		// 设置字体颜色和样式
		g.setColor(new Color(19, 148, 246));
		g.setFont(new Font("Georgia", Font.BOLD, fSize));
		for (int i = 0; i < codeLength; i++) {
			g.drawString(String.valueOf(securityCode.charAt(i)), i * 16 + 5,codeY);
		}
		// 关闭资源
		g.dispose();

		return image;
	}

	/**
	 * 返回验证码图片的流格式
	 * 
	 * @param securityCode
	 *            验证码
	 * @return ByteArrayInputStream 图片流
	 */
	public static ByteArrayInputStream getImageAsInputStream(String securityCode) {

		BufferedImage image = createImage(securityCode);
		return convertImageToStream(image);
	}

	/**
	 * 将BufferedImage转换成ByteArrayInputStream
	 * 
	 * @param image
	 *            图片
	 * @return ByteArrayInputStream 流
	 */
	private static ByteArrayInputStream convertImageToStream(BufferedImage image) {

		ByteArrayInputStream inputStream = null;
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(bos);
		try {
			jpeg.encode(image);
			byte[] bts = bos.toByteArray();
			inputStream = new ByteArrayInputStream(bts);
		} catch (ImageFormatException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return inputStream;
	}
}




package com.cpt.evn.util.randcodeutil;

import java.util.Arrays;

/**
 * 工具类,生成随机验证码字符串
 * 
 * @version 1.0 
 * @author 
 * 
 */
public class SecurityCode {

	/**
	 * 验证码难度级别,Simple只包含数字,Medium包含数字和小写英文,Hard包含数字和大小写英文
	 */
	public enum SecurityCodeLevel {
		Simple, Medium, Hard
	};

	/**
	 * 产生默认验证码,4位中等难度
	 * 
	 * @return String 验证码
	 */
	public static String getSecurityCode() {
		return getSecurityCode(4, SecurityCodeLevel.Simple, false);
	}

	/**
	 * 产生长度和难度任意的验证码
	 * 
	 * @param length
	 *            长度
	 * @param level
	 *            难度级别
	 * @param isCanRepeat
	 *            是否能够出现重复的字符,如果为true,则可能出现 5578这样包含两个5,如果为false,则不可能出现这种情况
	 * @return String 验证码
	 */
	public static String getSecurityCode(int length, SecurityCodeLevel level,
			boolean isCanRepeat) {

		// 随机抽取len个字符
		int len = length;

		// 字符集合(除去易混淆的数字0、数字1、字母l、字母o、字母O)
		char[] codes = { '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b',
				'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 'p',
				'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B',
				'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
				'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };

		// 根据不同的难度截取字符数组
		if (level == SecurityCodeLevel.Simple) {
			codes = Arrays.copyOfRange(codes, 0, 9);
		} else if (level == SecurityCodeLevel.Medium) {
			codes = Arrays.copyOfRange(codes, 0, 33);
		}

		// 字符集合长度
		int n = codes.length;

		// 抛出运行时异常
		if (len > n && isCanRepeat == false) {
			throw new RuntimeException(String.format(
					"调用SecurityCode.getSecurityCode(%1$s,%2$s,%3$s)出现异常,"
							+ "当isCanRepeat为%3$s时,传入参数%1$s不能大于%4$s", len,
					level, isCanRepeat, n));
		}

		// 存放抽取出来的字符
		char[] result = new char[len];

		// 判断能否出现重复的字符
		if (isCanRepeat) {
			for (int i = 0; i < result.length; i++) {
				// 索引 0 and n-1
				int r = (int) (Math.random() * n);

				// 将result中的第i个元素设置为codes[r]存放的数值
				result[i] = codes[r];
			}
		} else {
			for (int i = 0; i < result.length; i++) {
				// 索引 0 and n-1
				int r = (int) (Math.random() * n);

				// 将result中的第i个元素设置为codes[r]存放的数值
				result[i] = codes[r];

				// 必须确保不会再次抽取到那个字符,因为所有抽取的字符必须不相同。
				// 因此,这里用数组中的最后一个字符改写codes[r],并将n减1
				codes[r] = codes[n - 1];
				n--;
			}
		}

		return String.valueOf(result);
	}
}




http://www.cnblogs.com/dongliyang/archive/2012/08/24/2654431.html
发表评论
用户名: 匿名