驗證碼在網站中是一個非常常用的,主要用於有效防止對某一個特定註冊使用者用特定程式暴力破解方式進行不斷的登陸嘗試。
此示範代碼主要包括以下三部分:
1.checkCode.java :用於產生驗證碼
2.checkCodeServler
3.check.jsp 驗證
下面是checkCode.java的內容:
1 //用於擷取四位隨機數 2 private char mapTable[] = {'0','1','2','3','4','5','6','7','8','9'}; 3 4 //產生驗證碼,並返回隨機產生的數字 5 public String getEnsure(int width, int height, OutputStream os){ 6 if (width <= 0) 7 width = 60; 8 if (height <= 0) 9 height = 20;10 11 BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);12 13 // 擷取圖形上下文14 Graphics g = image.getGraphics();15 16 // 設定背景色17 g.setColor(new Color(0xDCCCCC));18 g.fillRect(0, 0, width, height);19 20 // 畫邊框21 g.setColor(Color.black);22 g.drawRect(0, 0, width - 1, height - 1);23 24 // 取隨機產生的認證碼25 String strEnsure = "";26 27 // 4代表4位驗證碼28 for (int i = 0; i < 4; ++i){29 strEnsure += mapTable[(int) (mapTable.length * Math.random())];30 }31 32 // 將認證碼顯示到圖象中33 g.setColor(Color.red);34 g.setFont(new Font("Atlantic Inline", Font.PLAIN, 14));35 36 // 畫的具體座標37 String str = strEnsure.substring(0, 1);38 g.drawString(str, 8, 14);39 str = strEnsure.substring(1, 2);40 g.drawString(str, 20, 15);41 str = strEnsure.substring(2, 3);42 g.drawString(str, 35, 18);43 str = strEnsure.substring(3, 4);44 g.drawString(str, 45, 15);45 46 // 釋放圖形上下文47 g.dispose();48 49 try{50 // 輸出圖象到頁面51 ImageIO.write(image, "JPEG", os);52 } catch (IOException e){53 return "";54 }55 56 return strEnsure; //返回產生的隨機數57 }
再是checkCodeServlet的內容
1 public void doGet(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 doPost(request, response); 4 } 5 6 public void doPost(HttpServletRequest request, HttpServletResponse response) 7 throws ServletException, IOException { 8 //禁用緩衝,每次訪問此頁面,都重建 9 response.setHeader("Pragma","No-cache"); 10 response.setHeader("Cache-Control","no-cache"); 11 response.setDateHeader("Expires", 0); 12 13 //產生驗證碼的執行個體對象14 CheckCode ie = new CheckCode();15 16 //調用裡面的方法,返回的是產生的驗證碼中的字串17 String str = ie.getEnsure(0,0,response.getOutputStream());18 19 //獲得session,並把字串儲存在session中,為後面的對比做基礎20 HttpSession session = request.getSession();21 session.setAttribute("strEnsure", str); 22 23 }
然後是web.xml對servlet的配置
1 <servlet>2 <servlet-name>CheckServlet</servlet-name>3 <servlet-class>com.blog.servlet.CheckServlet</servlet-class>4 </servlet>5 <servlet-mapping> 6 <servlet-name>CheckServlet</servlet-name> 7 <url-pattern>/check</url-pattern> 8 </servlet-mapping>
最後是jsp頁面的引用
1 <html> 2 <head> 3 <title>驗證碼</title> 4 <script type="text/javascript" language="javascript"> 5 //重新擷取驗證字元 6 function changeImage() 7 { 8 //單擊觸發圖片重載事件,完成圖片驗證碼的更換 9 document.getElementById("imgRandom").src = document.getElementById("imgRandom").src + '?';10 }11 </script>12 13 </head>14 15 <body>16 <img alt= "看不清楚?點擊更換驗證碼 " src= "check" width= "100" height= "50" id="imgRandom" onclick="changeImage()"/> 17 <a href="javascript:changeImage();">看不清?</a>18 </body>19 </html>
在jsp頁面中,只需要將img的src的屬性指向產生驗證碼的servlet就可以了,指向servle在web.xmlt映射的url(這裡我糾結了好久...)