1. 程式人生 > >javaweb之驗證碼驗證技術

javaweb之驗證碼驗證技術

not vax 查看 tint inf attr ringbuf 創建web工程 pro

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

技術分享圖片

技術分享圖片

技術分享圖片

javaweb之驗證碼驗證技術