驗證碼的作用:通常的登錄或者注冊系統時,都會要求用戶輸入驗證碼,以此區別用戶行為和計算機程序行為,目的是有人防止惡意注冊、暴力破解密碼等。
實現驗證碼的思路:用 server 實現隨機生成數字和字母組成圖片的功能,用 jsp 頁面實現顯示驗證碼和用戶輸入驗證碼的功能,再用 server 類分別獲取圖片和用戶輸入的數據,判斷兩個數據是否一致。
代碼實現
1.編寫數字、英文隨機生成的 server 類,源碼:
1 package com;
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.ByteArrayOutputStream;
8 import java.io.IOException;
9 import java.io.PrintWriter;
10
11 import javax.imageio.ImageIO;
12 import javax.servlet.ServletException;
13 import javax.servlet.ServletOutputStream;
14 import javax.servlet.http.HttpServlet;
15 import javax.servlet.http.HttpServletRequest;
16 import javax.servlet.http.HttpServletResponse;
17 import javax.servlet.http.HttpSession;
18
19 public class logcheck extends HttpServlet {
20
21 public logcheck() {
22 super();
23 }
24
25
26 public void destroy() {
27 super.destroy();
28 }
29
30 public void doGet(HttpServletRequest request, HttpServletResponse response)
31 throws ServletException, IOException {
32
33 doPost(request, response);
34 }
35
36
37 /*實現的核心代碼*/
38 public void doPost(HttpServletRequest request, HttpServletResponse response)
39 throws ServletException, IOException {
40
41 response.setContentType("image/jpeg");
42 HttpSession session=request.getSession();
43 int width=60;
44 int height=20;
45
46 //設置浏覽器不要緩存此圖片
47 response.setHeader("Pragma", "No-cache");
48 response.setHeader("Cache-Control", "no-cache");
49 response.setDateHeader("Expires", 0);
50
51 //創建內存圖像並獲得圖形上下文
52 BufferedImage image=new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
53 Graphics g=image.getGraphics();
54
55 /*
56 * 產生隨機驗證碼
57 * 定義驗證碼的字符表
58 */
59 String chars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
60 char[] rands=new char[4];
61 for(int i=0;i<4;i++){
62 int rand=(int) (Math.random() *36);
63 rands[i]=chars.charAt(rand);
64 }
65
66 /*
67 * 產生圖像
68 * 畫背景
69 */
70 g.setColor(new Color(0xDCDCDC));
71 g.fillRect(0, 0, width, height);
72
73 /*
74 * 隨機產生120個干擾點
75 */
76
77 for(int i=0;i<120;i++){
78 int x=(int)(Math.random()*width);
79 int y=(int)(Math.random()*height);
80 int red=(int)(Math.random()*255);
81 int green=(int)(Math.random()*255);
82 int blue=(int)(Math.random()*255);
83 g.setColor(new Color(red,green,blue));
84 g.drawOval(x, y, 1, 0);
85 }
86 g.setColor(Color.BLACK);
87 g.setFont(new Font(null, Font.ITALIC|Font.BOLD,18));
88
89 //在不同高度輸出驗證碼的不同字符
90 g.drawString(""+rands[0], 1, 17);
91 g.drawString(""+rands[1], 16, 15);
92 g.drawString(""+rands[2], 31, 18);
93 g.drawString(""+rands[3], 46, 16);
94 g.dispose();
95
96 //將圖像傳到客戶端
97 ServletOutputStream sos=response.getOutputStream();
98 ByteArrayOutputStream baos=new ByteArrayOutputStream();
99 ImageIO.write(image, "JPEG", baos);
100 byte[] buffer=baos.toByteArray();
101 response.setContentLength(buffer.length);
102 sos.write(buffer);
103 baos.close();
104 sos.close();
105
106 session.setAttribute("checkcode", new String(rands));
107 }
108
109
110 public void init() throws ServletException {
111 // Put your code here
112 }
113
114 }
2.用於顯示驗證碼的頁面:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 12 <title>index</title> 13 <meta http-equiv="pragma" content="no-cache"> 14 <meta http-equiv="cache-control" content="no-cache"> 15 <meta http-equiv="expires" content="0"> 16 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 17 <meta http-equiv="description" content="This is my page"> 18 <!-- 19 <link rel="stylesheet" type="text/css" href="styles.css"> 20 --> 21 </head> 22 23 <body> 24 <form action="yanzheng" method="post"> 25 <input type="text" name="name" size="5" maxlength="4"> 26 <a href="index.jsp"><img border="0" src="logcheck"></a><br><br> 27      <input type="submit" value="提交"> 28 </form> 29 </body> 30 </html>
3.用於檢驗輸入的驗證碼是否正確:
1 package com;
2
3 import java.io.IOException;
4 import java.io.PrintWriter;
5
6 import javax.jms.Session;
7 import javax.servlet.ServletException;
8 import javax.servlet.http.HttpServlet;
9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 import javax.servlet.http.HttpSession;
12
13 public class yanzheng extends HttpServlet {
14
15 public yanzheng() {
16 super();
17 }
18
19 public void destroy() {
20 super.destroy();
21 }
22
23 public void doGet(HttpServletRequest request, HttpServletResponse response)
24 throws ServletException, IOException {
25
26 doPost(request, response);
27 }
28 /*核心代碼*/
29 public void doPost(HttpServletRequest request, HttpServletResponse response)
30 throws ServletException, IOException {
31
32 String info=null;
33 /*獲取輸入的值*/
34 String value1=request.getParameter("name");
35
36 /*獲取圖片的值*/
37 HttpSession session=request.getSession();
38 String value2=(String)session.getAttribute("checkcode");
39
40 /*對比兩個值(字母不區分大小寫)*/
41 if(value2.equalsIgnoreCase(value1)){
42 info="驗證碼輸入正確";
43 }else{
44 info="驗證碼輸入錯誤";
45 }
46 System.out.println(info);
47 request.setAttribute("info", info);
48 request.getRequestDispatcher("/login.jsp").forward(request, response);
49 }
50
51
52 public void init() throws ServletException {
53 // Put your code here
54 }
55
56 }
4.顯示輸入結構界面(輸入驗證碼是否正確):
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <%
3 String path = request.getContextPath();
4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
5 %>
6
7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
8 <html>
9 <head>
10 <base href="<%=basePath%>">
11
12 <title>My JSP 'login.jsp' starting page</title>
13
14 <meta http-equiv="pragma" content="no-cache">
15 <meta http-equiv="cache-control" content="no-cache">
16 <meta http-equiv="expires" content="0">
17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
18 <meta http-equiv="description" content="This is my page">
19 <!--
20 <link rel="stylesheet" type="text/css" href="styles.css">
21 -->
22
23 </head>
24
25 <body>
26 <%=request.getAttribute("info") %>
27 </body>
28 </html>
5.項目結構、效果截圖:

