jsp页面获取java生成的图片验证码

实现自动生成图片验证码,点击验证码能够更换验证码

valida.jsp

<div class="valida">
	<input type="text" name="valida" id="valida" οnkeydοwn="doEnter();">
	<span><img src="${ctx}/code" id="imgValida" οnclick="this.src='${ctx}/code?a='+Math.random()" class="imgValida">
	</span>	
</div>
VerifyCodeServlet.java

import java.io.IOException;
import java.awt.image.BufferedImage;
import java.awt.Color;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.imageio.ImageIO;

/**
 * 向浏览器输出验证码
 *
 */
@WebServlet("/code")
public class VerifyCodeServlet extends HttpServlet {

	/**
	 * Constructor of the object.
	 */
	public VerifyCodeServlet() {
		super();
	}

	public void destroy() {
		super.destroy(); 
	}

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		
		        //设置浏览器不缓存本页				
		        response.setDateHeader("Expires", 0);   
		      	response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");  
		        response.addHeader("Cache-Control", "post-check=0, pre-check=0");   	       
		        response.setHeader("Pragma", "no-cache");   

				//生成验证码,写入用户session
				String verifyCode=VerifyCode.generateTextCode(VerifyCode.TYPE_NUM_UPPER,4,"0oOilJI1");
				request.getSession().setAttribute(VerifyCode.VERIFY_TYPE_COMMENT,verifyCode);
				System.out.println("verifyCode="+verifyCode);
				
				//输出验证码给客户端
				response.setContentType("image/jpeg");
				/*
				    textCode 文本验证码
					width 图片宽度
					height 图片高度
					interLine 图片中干扰线的条数
					randomLocation 每个字符的高低位置是否随机
					backColor 图片颜色,若为null,则采用随机颜色
					foreColor 字体颜色,若为null,则采用随机颜色
					lineColor 干扰线颜色,若为null,则采用随机颜色
				*/
				BufferedImage bim=VerifyCode.generateImageCode(verifyCode, 70, 22, 15,true,Color.WHITE,Color.BLACK,null);
				ServletOutputStream out=response.getOutputStream();
				ImageIO.write(bim, "JPEG",out);	
				try{
					out.flush();
				}finally{
					out.close();
				}
		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
                 doGet(request,response);
 }

	public void init() throws ServletException {
		// Put your code here
	}

}
VerifyCode.java

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

/**
 * 验证码生成器类,可生成数字、大写、小写字母及三者混合类型的验证码。
 * 支持自定义验证码字符数量;
 * 支持自定义验证码图片的大小;
 * 支持自定义需排除的特殊字符;
 * 支持自定义干扰线的数量;
 * 支持自定义验证码图文颜色
 */
public class VerifyCode {
	
	//验证码类型
	public static final String VERIFY_TYPE_COMMENT="VERIFY_TYPE_COMMENT";
	
	/**
	 * 验证码类型为仅数字 0~9
	 */
	public static final int TYPE_NUM_ONLY=0;

	/**
	 * 验证码类型为仅字母,即大写、小写字母混合
	 */
	public static final int TYPE_LETTER_ONLY=1;
	
	/**
	 * 验证码类型为数字、大写字母、小写字母混合
	 */
	public static final int TYPE_ALL_MIXED=2;

	/**
	 * 验证码类型为数字、大写字母混合
	 */
	public static final int TYPE_NUM_UPPER=3;		
	
	/**
	 * 验证码类型为数字、小写字母混合
	 */
	public static final int TYPE_NUM_LOWER=4;	
	
	/**
	 * 验证码类型为仅大写字母
	 */
	public static final int TYPE_UPPER_ONLY=5;
	
	/**
	 * 验证码类型为仅小写字母
	 */
	public static final int TYPE_LOWER_ONLY=6;
	
		
	private VerifyCode(){}

	/**
	 * 生成验证码字符串
	 * @param type 验证码类型,参见本类的静态属性
	 * @param length 验证码长度,大于0的整数
	 * @param exChars 需排除的特殊字符(仅对数字、字母混合型验证码有效,无需排除则为null)
	 * @return 验证码字符串
	 */
	public static String generateTextCode(int type,int length,String exChars){
		
		if(length<=0) return "";
		
		StringBuffer code=new StringBuffer();
		int i=0;
		Random r=new Random();
		
		switch(type)
		{
		
		//仅数字
		case TYPE_NUM_ONLY:
			while(i<length){
	            int t=r.nextInt(10);
				if(exChars==null||exChars.indexOf(t+"")<0){//排除特殊字符
					code.append(t);
					i++;
				}
			}
			break;
			
	    //仅字母(即大写字母、小写字母混合)
		case TYPE_LETTER_ONLY:
			while(i<length){
				int t=r.nextInt(123);
				if((t>=97||(t>=65&&t<=90))&&(exChars==null||exChars.indexOf((char)t)<0)){
					code.append((char)t);
					i++;	
				}
			}
			break;
		
		//数字、大写字母、小写字母混合
		case TYPE_ALL_MIXED:
			while(i<length){
				int t=r.nextInt(123);
				if((t>=97||(t>=65&&t<=90)||(t>=48&&t<=57))&&(exChars==null||exChars.indexOf((char)t)<0)){
					code.append((char)t);
					i++;
				}
			}
			break;	
			
		//数字、大写字母混合
		case TYPE_NUM_UPPER:
			while(i<length){
				int t=r.nextInt(91);
				if((t>=65||(t>=48&&t<=57))&&(exChars==null||exChars.indexOf((char)t)<0)){
					code.append((char)t);
					i++;
				}
			}
			break;		
			
		//数字、小写字母混合
		case TYPE_NUM_LOWER:
			while(i<length){
				int t=r.nextInt(123);
				if((t>=97||(t>=48&&t<=57))&&(exChars==null||exChars.indexOf((char)t)<0)){
					code.append((char)t);
					i++;
				}
			}
			break;		
			
		//仅大写字母
		case TYPE_UPPER_ONLY:
			while(i<length){
				int t=r.nextInt(91);
				if((t>=65)&&(exChars==null||exChars.indexOf((char)t)<0)){
					code.append((char)t);
					i++;
				}
			}
			break;				
			
		//仅小写字母
		case TYPE_LOWER_ONLY:
			while(i<length){
				int t=r.nextInt(123);
				if((t>=97)&&(exChars==null||exChars.indexOf((char)t)<0)){
					code.append((char)t);
					i++;
				}
			}
			break;				
		
		}
		
		return code.toString();
	}

	
	/**
	 * 已有验证码,生成验证码图片
	 * @param textCode 文本验证码
	 * @param width 图片宽度
	 * @param height 图片高度
	 * @param interLine 图片中干扰线的条数
	 * @param randomLocation 每个字符的高低位置是否随机
	 * @param backColor 图片颜色,若为null,则采用随机颜色
	 * @param foreColor 字体颜色,若为null,则采用随机颜色
	 * @param lineColor 干扰线颜色,若为null,则采用随机颜色
	 * @return 图片缓存对象
	 */
	public static BufferedImage generateImageCode(String textCode,int width,int height,int interLine,boolean randomLocation,Color backColor,Color foreColor,Color lineColor){
		
		
		BufferedImage bim=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
		Graphics g=bim.getGraphics();
		//画背景图
		g.setColor(backColor==null?getRandomColor():backColor);
		g.fillRect(0,0,width,height);
		
		//画干扰线
		Random r=new Random();
		if(interLine>0){
	
			int x=0,y=0,x1=width,y1=0;
			for(int i=0;i<interLine;i++){
				g.setColor(lineColor==null?getRandomColor():lineColor);
				y=r.nextInt(height);
				y1=r.nextInt(height);
	
				g.drawLine(x,y,x1,y1);
			}
		}
		
		//字体大小为图片高度的80%
		int fsize=(int)(height*0.8);
		int fx=height-fsize;
		int fy=fsize;
		
		g.setFont(new Font("Times New Roman", Font.BOLD, 20));
		
		//写验证码字符
		for(int i=0;i<textCode.length();i++){
			fy=randomLocation?(int)((Math.random()*0.3+0.6)*height):fy;//每个字符高低是否随机
			g.setColor(foreColor==null?getRandomColor():foreColor);
			g.drawString(textCode.charAt(i)+"",fx,fy);
			fx+=fsize*0.9;
		}
		
		g.dispose();
		
		return bim;
	}

	
	
	/**
	 * 直接生成图片验证码
	 * @param type 验证码类型,参见本类的静态属性
	 * @param length 验证码字符长度,大于0的整数
	 * @param exChars 需排除的特殊字符
	 * @param width 图片宽度
	 * @param height 图片高度
	 * @param interLine 图片中干扰线的条数
	 * @param randomLocation 每个字符的高低位置是否随机
	 * @param backColor 图片颜色,若为null,则采用随机颜色
	 * @param foreColor 字体颜色,若为null,则采用随机颜色
	 * @param lineColor 干扰线颜色,若为null,则采用随机颜色
	 * @return 图片缓存对象
	 */
	public static BufferedImage generateImageCode(int type,int length,String exChars,int width,int height,int interLine,boolean randomLocation,Color backColor,Color foreColor,Color lineColor){
		
		String textCode=generateTextCode(type,length,exChars);
		BufferedImage bim=generateImageCode(textCode,width,height,interLine,randomLocation,backColor,foreColor,lineColor);
		
		return bim;
	}
	
	/**
	 * 产生随机颜色
	 * @return
	 */
	private static Color getRandomColor(){
		Random r=new Random();
		Color c=new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255));
		return c;
	}

}

效果图


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值