Jsp+servlet 验证码案例

Posted cynchanpin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 验证码案例的主要内容,如果未能解决你的问题,请参考以下文章

Javaweb 响应——生成验证码

Javaweb 响应——生成验证码

动态生成验证码案例(Java)

网页登陆注册(jsp实现)验证码

jsp使用servlet实现用户登录 及动态验证码

JSP 设计教师与学生不同登陆界面(带验证码)