javaweb之驗證碼驗證技術


今天學習了一個驗證碼校驗技術,所以就寫下了一些筆記,方便日后查看。首先創建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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM