Jsp+servlet 验证码案例

昨晚在csdn看到一位前辈写一个ajax+servlet+jsp验证,顿时心血来潮,在阅读前辈的代码下我亲手体验一下,做了一个验证码生成工具类,以供大家做个参考。

1:添加VeriyCodeUtils类生成验证码图像

package com.servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;

/**
 * 
 * @author hubiao
 *		验证码生成器
 * 	用到API
 * 		BufferedImage 创建一个图像
 * 		Graphics2D  绘制
 * 			fillRect(x,y,width,height);背景
 * 			font()字体
 * 			drawRect();边框
 * 			drawLine();线
 * 			drwaString:图像数据
 * 		ImageIO 生成图像
 */
public class VeriyCodeUtils {
	/**
	 * @param output 保存验证图像的流
	 * @return  验证码
	 */
	public static String newVeriyCode(OutputStream output)
	{
		int width = 90;
		int height = 40;
		int codeCount = 5;
		char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',     
	            'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',     
	            'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };  
		
		//创建图像对象,8位RGB
		BufferedImage buffered = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		
		//通过Crapahices来绘制图像到BufferedImage中
		Graphics2D gra = buffered.createGraphics();
		
		//设置图片背景:白色
		gra.setColor(Color.WHITE);
		gra.fillRect(0, 0, width, height);
		
		//设置字体,字体大小根据图片高度决定
		gra.setFont(new Font("Fixedsys",Font.PLAIN,height-2));
		
		//设置边框:黑色,1cm
		gra.setColor(Color.BLACK);
		gra.drawRect(0, 0, width-1, height-1);
		
		//生成10条黑色干扰线
		gra.setColor(Color.BLACK);
		Random ran = new Random(); 
		for(int i = 0; i < 70;i++)
		{
			int x = ran.nextInt(255);
			int y = ran.nextInt(255);
			int x1 = ran.nextInt(255);
			int y1 = ran.nextInt(255);
			gra.drawLine(x, y,x+x1, y+y1);//画直线
		}
		//生成验证码
		StringBuffer sb = new StringBuffer();
		int r = 0,g = 0,b = 0; 
		for(int i = 0; i < codeCount; i++)
		{
			String strRand = String.valueOf(codeSequence[ran.nextInt(codeSequence.length)]);
			//对每位验证码都生成不同的颜色,增加识别系统难度
			r = ran.nextInt(255);
			g = ran.nextInt(255);
			b = ran.nextInt(255);
			gra.setColor(new Color(r, g, b));
			gra.drawString(strRand, (i+1)*13, height-4);
			sb.append(strRand);
		}
		try {
			ImageIO.write(buffered, "jpeg", output);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		
		return sb.toString();
	}
}

2:servlet使用验证码

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//禁止图像缓存
        resp.setHeader("Pragma", "no-cache");     
        resp.setHeader("Cache-Control", "no-cache");     
        resp.setDateHeader("Expires", 0);   
        resp.setContentType("image/jpeg");
        
        //生成验证码图像
		String veriyCode = VeriyCodeUtils.newVeriyCode(resp.getOutputStream());
		
		//将验证码保存到session中
		HttpSession session = req.getSession();
		session.setAttribute("validateCode", veriyCode);
	}
3:JSP页面使用验证码
</head>
  <script type="text/javascript">
		function createCode()
		{
		 	var t = new Date().getTime();//防止页面缓存,使用时间搓
			var srcImg = document.getElementById("srcImg");
			srcImg.src="/ImgVeifyWeb/vity.do?"+t; 
		}
  </script>
  <body>
  	<h1>${requestScope.code}</h1>
  	<img id="srcImg" src="<c:url value="/vity.do"></c:url>" 	/>  #这里使用直接让img访问servlet,通过response响应一个图像流
  	<a href="##" id="codeId" onclick="createCode()">换一张</a>
  	<form action="<c:url value="/hello.do"></c:url>" method="post">
	  	<input type="text" name="codeVify"/>
	  	<input type="submit" value="提交"/>
  	</form>
  </body>
3:校验验证码

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		HttpSession session = req.getSession();
		Object validateCode = session.getAttribute("validateCode");
		System.out.println(validateCode);
		
		String codeVify = req.getParameter("codeVify");
		if(codeVify==null || codeVify.equals(""))
		{
			req.setAttribute("code","验证证不能为空");
			req.getRequestDispatcher("/index.jsp").forward(req, resp);
			return;
		}else if(!validateCode.toString().equalsIgnoreCase(codeVify))
		{
			req.setAttribute("code","验证证错误");
			req.getRequestDispatcher("/index.jsp").forward(req, resp);
			return;
		}
		System.out.println("下面开始 做其他业务操作....");
	}
校验图如下:


Jsp+servlet 验证码案例,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。