今天學習了一個驗證碼校驗技術,所以就寫下了一些筆記,方便日后查看。首先創建web工程
1、然后在src目錄下創建一個Servlet類,此類用來顯示登錄頁面和錯誤信息提示
1 package com.LHB; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.annotation.WebServlet; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 /** 13 * Servlet implementation class Login 14 */ 15 @WebServlet("/Login") 16 public class Login extends HttpServlet { 17 private static final long serialVersionUID = 1L; 18 19 /** 20 * @see HttpServlet#HttpServlet() 21 */ 22 public Login() { 23 super(); 24 // TODO Auto-generated constructor stub 25 } 26 27 /** 28 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 29 */ 30 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 31 32 response.setContentType("text/html;charset=utf-8"); 33 PrintWriter out = response.getWriter(); 34 35 //返回一個界面 36 37 out.println("<h1>用戶登錄</h1>"); 38 out.println("<form action='/CheckCode/LoginCl' method='get'>"); 39 out.println("用戶名:<input type='text' name='id'><br>"); 40 out.println("密碼:<input type='password' name='password'><br>"); 41 out.println("驗證碼:<input type='text' name='checkcode'><img src='/CheckCode/CreateCode'><br>");//加載驗證碼圖片是只要將產生驗證碼的對應類路徑指定到img標簽中即可 42 out.println("<input type='submit' value='登錄'><br>"); 43 44 out.println("</form>"); 45 String err=(String) request.getAttribute("err"); 46 if(err!=null) { 47 out.println(err); 48 } 49 } 50 51 /** 52 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 53 */ 54 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 55 // TODO Auto-generated method stub 56 doGet(request, response); 57 } 58 59 }
2、繼續創建一個Servlet,用來顯示校驗成功后的頁面。
1 package com.LHB; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.annotation.WebServlet; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 /** 13 * Servlet implementation class LoginCl 14 */ 15 @WebServlet("/LoginCl") 16 public class LoginCl extends HttpServlet { 17 private static final long serialVersionUID = 1L; 18 19 /** 20 * @see HttpServlet#HttpServlet() 21 */ 22 public LoginCl() { 23 super(); 24 // TODO Auto-generated constructor stub 25 } 26 27 /** 28 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 29 */ 30 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 31 32 response.setContentType("text/html;charset=utf-8"); 33 PrintWriter out = response.getWriter(); 34 35 //獲取用戶的id/password/輸入驗證碼 36 String id = request.getParameter("id"); 37 String passwd = request.getParameter("password"); 38 String checkCode = request.getParameter("checkcode"); 39 //取出session中驗證碼 40 String checkcode2 = (String) request.getSession().getAttribute("checkcode"); 41 42 //1.先驗證碼 43 if(checkCode.equals(checkcode2)) { 44 //驗證碼ok 45 request.getRequestDispatcher("/OK").forward(request, response); 46 //到數據庫去驗證 47 }else { 48 request.setAttribute("err", "驗證碼錯誤"); 49 request.getRequestDispatcher("/Login").forward(request, response); 50 } 51 52 53 } 54 55 /** 56 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 57 */ 58 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 59 // TODO Auto-generated method stub 60 doGet(request, response); 61 } 62 63 }
3、最后創建驗證碼產生的Servlet,用來產生隨機數校驗碼圖片,並將該驗證碼圖片返回到客戶端。此類比較關鍵。
1 package com.LHB; 2 3 import java.awt.Color; 4 import java.awt.Font; 5 import java.awt.Graphics; 6 import java.awt.image.BufferedImage; 7 import java.io.IOException; 8 import java.util.Random; 9 10 import javax.imageio.ImageIO; 11 import javax.servlet.ServletException; 12 import javax.servlet.annotation.WebServlet; 13 import javax.servlet.http.HttpServlet; 14 import javax.servlet.http.HttpServletRequest; 15 import javax.servlet.http.HttpServletResponse; 16 17 18 /** 19 * Servlet implementation class CreateCode 20 */ 21 @WebServlet("/CreateCode") 22 public class CreateCode extends HttpServlet { 23 private static final long serialVersionUID = 1L; 24 25 /** 26 * @see HttpServlet#HttpServlet() 27 */ 28 public CreateCode() { 29 super(); 30 // TODO Auto-generated constructor stub 31 } 32 33 /** 34 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 35 */ 36 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 37 38 //禁止瀏覽器緩沖隨機圖片 39 response.setDateHeader("Expires", -1);//防止啟動瀏覽器時取先前緩沖的數據 40 response.setHeader("Cache-Control", "no-cache"); 41 response.setHeader("Pragma", "no-cache"); 42 43 //通知客戶機以圖片方式打開發送過去的數據 44 response.setHeader("Content-Type", "image/jpeg"); 45 46 //在內存中創建一副圖片 47 BufferedImage image = new BufferedImage(80, 30, BufferedImage.TYPE_INT_BGR); 48 49 //想圖片上寫數據 50 Graphics graphics = image.getGraphics(); 51 52 //設置背景色 53 graphics.setColor(Color.WHITE); 54 graphics.fillRect(0, 0, 80, 30); 55 56 //設置寫入數據的顏色和字體 57 graphics.setColor(Color.BLACK); 58 graphics.setFont(new Font(null, Font.BOLD, 20)); 59 60 //像圖片上寫數據 61 String num = makeNum(); 62 63 //把隨機生成的數值,保存到session中 64 request.getSession().setAttribute("checkcode", num); 65 graphics.drawString(num, 0, 20); 66 67 //把寫好數據的圖片輸出給瀏覽器 68 ImageIO.write(image, "jpg", response.getOutputStream()); 69 70 71 } 72 73 /** 74 * 功能:隨機生成7位數字 75 * @return 76 */ 77 private String makeNum() { 78 Random random = new Random(); 79 //9999999可以生成7位數 80 String num = random.nextInt(9999999)+""; 81 StringBuffer stringBuffer = new StringBuffer(); 82 //如果不夠指定位數則補0 83 for(int i=0;i<7-num.length();i++) { 84 stringBuffer.append("0"); 85 } 86 num = stringBuffer.toString() + num; 87 return num; 88 } 89 90 /** 91 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 92 */ 93 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 94 // TODO Auto-generated method stub 95 doGet(request, response); 96 } 97 98 }
4