標籤:驗證碼 驗證碼技術樣本 驗證碼樣本
繼續總結與編程相關的技術,今天總結的是大學期間關於驗證碼技術的一個小樣本:
代碼1——產生驗證碼的jsp檔案,檔案名稱:captcha.jsp:
<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*,java.io.*" %><html><body><%!Color getRandColor(int fc,int bc){Random random = new Random();if(fc>255) fc=255;if(bc>255) bc=255;int r=fc+random.nextInt(bc-fc);int g=fc+random.nextInt(bc-fc);int b=fc+random.nextInt(bc-fc);return new Color(r,g,b);}%><%response.setHeader("Pragma","No-cache");response.setHeader("Cache-Control","no-cache");response.setDateHeader("Expires", 0);int width=60;int height=20;BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics graphics = image.getGraphics();graphics.setColor(getRandColor(200,250));graphics.fillRect(0, 0, width, height);graphics.setFont(new Font("Times New Roman",Font.PLAIN,18));graphics.setColor(getRandColor(160,200));graphics.drawRect(0,0,width-1,height-1);Random random = new Random();for (int i=0;i<155;i++){int x = random.nextInt(width);int y = random.nextInt(height);int xl = random.nextInt(12);int yl = random.nextInt(12);graphics.drawLine(x,y,x+xl,y+yl);}String sRand="";for (int i=0;i<4;i++){String rand=String.valueOf(random.nextInt(10));sRand+=rand;graphics.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));graphics.drawString(rand,13*i+6,16);}session.setAttribute("rand",sRand);graphics.dispose();ImageIO.write(image,"JPEG",response.getOutputStream());out.clear();out = pageContext.pushBody();%></body></html> 代碼2——使用驗證碼的jsp檔案,檔案名稱:index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";%><html><head><title>驗證碼的使用</title><script type="text/javascript"> function reloadImage(){ document.getElementById("safecode").src="captcha.jsp?seed"+Math.random(); return false; } function checkYanZhengMa(){ var value = document.getElementById("yanzhengma").value;//擷取使用者在“驗證碼”文字框中輸入的驗證碼。 if(value==""){ document.getElementById("showYanZhengMa").innerHTML="<font color='red' size='2'>驗證碼不可為空!!!</font>"; } else{ var xmlHttpRequest = null; if(window.XMLHttpRequest){//適用於IE7以上(包括IE7)的IE瀏覽器、Firefox瀏覽器、Google瀏覽器和Opera瀏覽器 xmlHttpRequest = new XMLHttpRequest();//建立XMLHttpRequest }else if(window.ActiveXObject){//適用於IE6.0以下(包括IE6.0)的IE瀏覽器 xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP"); }//第一步,每次請求都需要重新建立一個XMLHttpRequest對象 xmlHttpRequest.open("post","./AjaxCheckCaptchaServlet",true);//第二步,open方法中的三個參數分別是:請求方式、路徑、是否非同步(true表示非同步,false表示同步) xmlHttpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlHttpRequest.send("yanzhengma_value="+value);//第三步 發送請求 xmlHttpRequest.onreadystatechange=listeningReadyState;//第四步 監聽 處理響應後的資料 ,注意狀態是4時處理 function listeningReadyState(){ if(xmlHttpRequest.readyState==4){ var responseValue=xmlHttpRequest.responseText; if(responseValue==1){ document.getElementById("showYanZhengMa").innerHTML="<font color='green' size='2'>通過驗證!!!</font>";}else if(responseValue==2){document.getElementById("showYanZhengMa").innerHTML="<font color='red' size='2'>驗證碼輸入錯誤!!!</font>";} } } } } </script></head><body><input type="text" id="yanzhengma" name="yanzhengma" size="6" onblur="checkYanZhengMa();"> <img name="safecode" id="safecode" src="./captcha.jsp" onclick="reloadImage();"/><font color="#000000" size="4"><strong><a href="#" onclick="reloadImage();">換一張</a></strong></font> <font size="2" id="showYanZhengMa"> *請正確填寫驗證碼。</font></body></html> 代碼3——非同步校正驗證碼的java檔案,檔案名稱:AjaxCheckCaptchaServlet:
package com.ghj.packageofservlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class AjaxCheckCaptchaServlet extends HttpServlet {private static final long serialVersionUID = 6312962948471033343L;public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request,response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("UTF-8");PrintWriter out = response.getWriter();HttpSession session=request.getSession();String yanzhengma=request.getParameter("yanzhengma_value");//擷取使用者在“驗證碼”文字框中輸入的驗證碼,引號中的值為引號傳參中的key。System.out.println("非同步驗證————使用者輸入的驗證碼是:"+yanzhengma);String rand = ((String)session.getAttribute("rand")).trim();//得到原驗證碼,"rand"來自captcha.jsp System.out.println("非同步驗證————原驗證碼是:"+rand);if (rand.equals(yanzhengma)) {out.print("1");//“1”表示使用者輸入的驗證碼和原驗證碼一致。} else {out.print("2");//“2”表示使用者輸入的驗證碼和原驗證碼不一致。}out.flush();out.close();}} 代碼4——配置Servlet的xml檔案,檔案名稱:web.xml:
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>AjaxCheckCaptchaServlet</servlet-name> <servlet-class>com.ghj.packageofservlet.AjaxCheckCaptchaServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AjaxCheckCaptchaServlet</servlet-name> <url-pattern>/AjaxCheckCaptchaServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>
示範說明:將驗證碼輸入到文字框後,請讓該文字框失去焦點,程式採用非同步方式校正所輸入的驗證碼和原來產生的驗證碼是否一致。
【0分下載資源】