1. 程式人生 > >Jsp+servlet 驗證碼案例

Jsp+servlet 驗證碼案例

依據 lib 禁止 ignore body urn log graph control

昨晚在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 驗證碼案例