JavaWeb驗證碼

效果

JSP代碼

<div class="inputbox">
     <label for="mima">驗證碼:</label>
     <input id="confirm" type="text" name="confirm" placeholder=" " required style="width:35px"/>
     <img src="/MarkSystem/ImagServlet" onclick="changeImage();" id="pp"/>
     <a href="#" onclick="changeImage();">看不清</a>
     <span style="color: red">
           ${request.getAttribute("message")}<!--提示驗證碼輸入錯誤  -->
     </span>
</div>

Servlet代碼

package com.yang.servlet;

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

import javax.imageio.ImageIO;
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.servlet.http.HttpSession;

/**
 * 負責生成一個隨機的驗證碼圖片
 */
@WebServlet("/ImagServlet")
public class ImagServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//負責生成一個驗證碼
		int width=75;
		int height=25;
		//需要一個畫圖工具類
		BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		//畫筆
		Graphics g = bi.getGraphics();
		//給畫布填充顏色,白色
		g.setColor(Color.WHITE);
		g.fillRect(0, 0, width, height);
		//繪製外邊框
		g.setColor(Color.BLACK);
		g.drawRect(0, 0, width-1, height-1);
		// 生成隨機驗證碼 大小字母和數字 62
		char[] array = { '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', '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' }; // 62

		//常用中文字庫
		String str = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66";
				
		StringBuffer sb = new StringBuffer();
		Random r = new Random();
		for (int i = 1; i <= 4; i++) {
		int index = r.nextInt(62); // 0-61
		String c = array[index] + "";

		Font f = new Font("Arial", Font.BOLD, 16);// 字體樣式
		g.setFont(f);
		// 0-255
		int red = r.nextInt(256);
		int green = r.nextInt(256);
		int blue = r.nextInt(256);

		Color color = new Color(red, green, blue); // 隨機色
		g.setColor(color);
		  
		g.drawString(c, (65 / 5) * i, 20); // 向圖片上挨個寫字
		sb.append(c);
				}
		//把系統生成的驗證碼存一下session,一會兒需要驗證
		HttpSession session = request.getSession();
		session.setAttribute("systemcode", sb.toString());
				
		System.out.println("系統生成的驗證碼:"+sb.toString());

		// 繪製干擾線
		for (int i = 1; i <= 8; i++) {
					
		int red = r.nextInt(256);
		int green = r.nextInt(256);
		int blue = r.nextInt(256);
		Color color = new Color(red, green, blue); // 隨機色
		g.setColor(color);

		int x1 = r.nextInt(width);
		int y1 = r.nextInt(height);

		int x2 = r.nextInt(width);
		int y2 = r.nextInt(height);

		g.drawLine(x1, y1, x2, y2);
				}

		// 輸出圖片
		response.setContentType("image/jpeg"); // 設置圖片格式
		ServletOutputStream out = response.getOutputStream();// 字節輸出流
		ImageIO.write(bi, "jpeg", out);
	}

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

	

}

登錄的Servlet檢驗驗證碼的正確性

String usercode = request.getParameter("confirm");//用戶輸入的驗證碼
String systemcode = (String)session.getAttribute("systemcode");//系統生成的驗證碼
User u = new User(username, password);
if(usercode.equalsIgnoreCase(systemcode)) {
	User user = us.login(u);
	if(user!=null) {
	//登錄成功,存儲session,跳轉首頁
	session.setAttribute("userid", user);
	//跳轉
	response.getWriter().println("<script>location.href='index.jsp'</script>");
	  }else {
			//登錄失敗,跳轉到登錄界面
			request.setAttribute("message", "賬號或密碼錯誤!");
			request.getRequestDispatcher("login.jsp").forward(request, response);
			}
}else {
	//驗證碼錯誤
	request.setAttribute("message", "驗證碼錯誤!"); 
	//必須轉發
	request.getRequestDispatcher("login.jsp").forward(request, response);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章