Java通用驗(yàn)證碼程序及應(yīng)用示例(提供源碼下載)

          把之前項(xiàng)目中寫(xiě)的一個(gè)Java通用驗(yàn)證碼程序整理了一下,與大家分享,希望能拋磚引玉。

          一、主要功能:

          1、支持純數(shù)字、大寫(xiě)字母、小寫(xiě)字母,及兩兩混合或三者混合類(lèi)型驗(yàn)證碼;

          2、支持自定義特殊字符排除(如0oOi1jI);

          3、支持圖片及文字兩種類(lèi)型驗(yàn)證碼;

          4、支持自定義驗(yàn)證碼圖片大小;

          5、支持自定義干擾線條數(shù);

          6、支持自定義及隨機(jī)定義圖片、文字、干擾線顏色;


          其他:示例頁(yè)面提供了<iframe>和<img>兩種頁(yè)面顯示驗(yàn)證碼的方式。


          a、僅阿拉伯?dāng)?shù)字

          b、僅字母(大小寫(xiě)混合)

          c、僅小寫(xiě)字母

          d、僅大寫(xiě)字母

          d、數(shù)字與小寫(xiě)字母混合

          e、數(shù)字與大寫(xiě)字母混合

          f、數(shù)字與大小寫(xiě)字母混合

          g、自定義字符顏色(或隨機(jī))

          h、自定義圖片顏色(或隨機(jī))

          i、自定義干擾線的條數(shù)及顏色(或隨機(jī))

          j、自定義驗(yàn)證碼圖片大小

          k、自定義需排除的特殊字符(如0o等難分辨字符)


          二、代碼說(shuō)明:

          1、pubMsg.jsp 發(fā)表留言頁(yè)面,實(shí)現(xiàn)<iframe>和<img>兩種顯示驗(yàn)證碼方式,及ajax提交功能


          <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
          <%
          String path = request.getContextPath();
          String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
          %>

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
            
          <head>
              
          <title><%=basePath%></title>
            
          </head>

            
          <script type="text/javascript">
            
            
          var req;
            
            
          //提交留言
            function pubMsg(){

                msgTitle
          =document.msgForm.msgTitle.value;
                msgContent
          =document.msgForm.msgContent.value;
                verifyCode
          =document.msgForm.verifyCode.value;
                
                
          //檢查輸入內(nèi)容格式
                if(msgTitle.length<5||msgContent.length<5)
                {
                    alert(
          "標(biāo)題和內(nèi)容不能少于5個(gè)字符");
                    
          return;
                }
              
          if(verifyCode.length==0){
                  alert(
          "請(qǐng)輸入驗(yàn)證碼");
                  
          return;
              }
              
              
          //獲得XMLHttpRequest對(duì)象
              if(window.XMLHttpRequest)
                  req
          =new XMLHttpRequest();
              
          else if(window.ActiveXObject)
                  req
          =new ActiveXObject("Microsoft.XMLHTTP");
              
              
          //提交請(qǐng)求
              if(req){
                  req.onreadystatechange
          =callBack;//指定服務(wù)器響應(yīng)結(jié)果處理函數(shù)(注意僅函數(shù)名無(wú)括號(hào))
                  url="<%=path%>/servlet/PubMsgServlet?msgTitle="+msgTitle+"&msgContent="+msgContent+"&verifyCode="+verifyCode;
                  req.open(
          "GET",url,false);
                  req.send();
                  
              }
            
            }
            
            
          //服務(wù)器響應(yīng)結(jié)果處理函數(shù)
            function callBack(){

                
          if(req.readyState==4){
                    
          if(req.status==200){
                        next
          =req.responseText;//獲得服務(wù)器處理結(jié)果
                        if(next=="this"){
                            alert(
          "驗(yàn)證碼不正確,請(qǐng)重新輸入");
                            verifyCodeFrame.location.reload();
          //刷新驗(yàn)證碼
                        }
                        
          else{
                            document.msgForm.msgTitle.value
          ="";
                            document.msgForm.msgContent.value
          ="";
                            window.location
          =next;//跳轉(zhuǎn)頁(yè)面
                        }
                    }
          else
                    {
                        alert(req.status
          +":"+req.statusText);
                    }
                }
                document.msgForm.verifyCode.value
          ="";
            }
            
            
          //更換驗(yàn)證碼
            function changeVerifyCode(){
              
              
          //1、如果用<iframe>實(shí)現(xiàn),則重新加載<iframe>的內(nèi)容
                //verifyCodeFrame.location.reload();
                
                
          //2、如果用<img>實(shí)現(xiàn),則修改<img src=url>的url
                //這里有一個(gè)小技巧,如果給url賦相同的值,瀏覽器不會(huì)重新發(fā)出請(qǐng)求,因此用js生成一個(gè)即時(shí)毫秒數(shù)做url中的參數(shù)
                t=new Date().getTime();
                document.msgForm.verifyCodeImg.src
          ="<%=path%>/servlet/VerifyCodeServlet?t="+t;
            }
             
            
          </script>
            
            
          <body>
            
            
          <form name="msgForm" action="" method="post">
            
          <table border=0>
            
          <tr><td>標(biāo)題:</td><td><input name="msgTitle" size="65"/></td></tr>
            
          <tr><td>內(nèi)容:</td><td><textarea name="msgContent" rows="10" cols="64"></textarea></td></tr>
            
          <tr><td>驗(yàn)證碼:</td><td><input name="verifyCode" style="height:29px;width=70px;font-size:25px"/>
            
            
          <!-- 以下:兩種顯示驗(yàn)證碼的方式 -->
            
            
          <!-- 1、采用<iframe>實(shí)現(xiàn) -->
            
          <!--
            <iframe name="verifyCodeFrame" src="<%=path+"/servlet/VerifyCodeServlet"%>" width="100" height="30" frameborder=0 align="top" marginheight=0 marginwidth=0 scrolling=no></iframe>
             
          -->
            
          <!-- 2、采用<img>實(shí)現(xiàn) -->
            
          <img name="verifyCodeImg" src="<%=path%>/servlet/VerifyCodeServlet" style="cursor:hand" align="top" onClick="changeVerifyCode()"/>
            
            
          <!-- 以上:兩種顯示驗(yàn)證碼的方式 -->
            
            
            
          <font style="color:blue;font-size=14"><href="javascript:changeVerifyCode()">看不清?</a></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            
          <input type="button" value=" 發(fā)表留言 " onClick="pubMsg()"/></td></tr>

            
          </table>
            
          </form>
            
            
          </body>
            
          </html>


          2、ok.jsp 留言發(fā)布成功頁(yè)面(示意)

          <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
            
          <body> 
              您的留言已提交!
          <input type="button" value=" OK " onClick="window.history.go(-1)"/><br>
            
          </body>
          </html>

          3、org.javachina.util.VerifyCode.java 驗(yàn)證碼生成器類(lèi)
          package org.javachina.util;

          import java.util.Random;
          import java.awt.image.BufferedImage;
          import java.awt.Graphics;
          import java.awt.Font;
          import java.awt.Color;


          /**
           * 驗(yàn)證碼生成器類(lèi),可生成數(shù)字、大寫(xiě)、小寫(xiě)字母及三者混合類(lèi)型的驗(yàn)證碼。
           * 支持自定義驗(yàn)證碼字符數(shù)量;
           * 支持自定義驗(yàn)證碼圖片的大小;
           * 支持自定義需排除的特殊字符;
           * 支持自定義干擾線的數(shù)量;
           * 支持自定義驗(yàn)證碼圖文顏色
           * 
          @author org.javachina
           * 
          @version 1.01
           
          */
          public class VerifyCode {
              
              
          /**
               * 驗(yàn)證碼類(lèi)型為僅數(shù)字 0~9
               
          */
              
          public static final int TYPE_NUM_ONLY=0;

              
          /**
               * 驗(yàn)證碼類(lèi)型為僅字母,即大寫(xiě)、小寫(xiě)字母混合
               
          */
              
          public static final int TYPE_LETTER_ONLY=1;
              
              
          /**
               * 驗(yàn)證碼類(lèi)型為數(shù)字、大寫(xiě)字母、小寫(xiě)字母混合
               
          */
              
          public static final int TYPE_ALL_MIXED=2;

              
          /**
               * 驗(yàn)證碼類(lèi)型為數(shù)字、大寫(xiě)字母混合
               
          */
              
          public static final int TYPE_NUM_UPPER=3;        
              
              
          /**
               * 驗(yàn)證碼類(lèi)型為數(shù)字、小寫(xiě)字母混合
               
          */
              
          public static final int TYPE_NUM_LOWER=4;    
              
              
          /**
               * 驗(yàn)證碼類(lèi)型為僅大寫(xiě)字母
               
          */
              
          public static final int TYPE_UPPER_ONLY=5;
              
              
          /**
               * 驗(yàn)證碼類(lèi)型為僅小寫(xiě)字母
               
          */
              
          public static final int TYPE_LOWER_ONLY=6;
              
                  
              
          private VerifyCode(){}

              
          /**
               * 生成驗(yàn)證碼字符串
               * 
          @param type 驗(yàn)證碼類(lèi)型,參見(jiàn)本類(lèi)的靜態(tài)屬性
               * 
          @param length 驗(yàn)證碼長(zhǎng)度,大于0的整數(shù)
               * 
          @param exChars 需排除的特殊字符(僅對(duì)數(shù)字、字母混合型驗(yàn)證碼有效,無(wú)需排除則為null)
               * 
          @return 驗(yàn)證碼字符串
               
          */
              
          public static String generateTextCode(int type,int length,String exChars){
                  
                  
          if(length<=0return "";
                  
                  StringBuffer code
          =new StringBuffer();
                  
          int i=0;
                  Random r
          =new Random();
                  
                  
          switch(type)
                  {
                  
                  
          //僅數(shù)字
                  case TYPE_NUM_ONLY:
                      
          while(i<length){
                          
          int t=r.nextInt(10);
                          
          if(exChars==null||exChars.indexOf(t+"")<0){//排除特殊字符
                              code.append(t);
                              i
          ++;
                          }
                      }
                      
          break;
                      
                  
          //僅字母(即大寫(xiě)字母、小寫(xiě)字母混合)
                  case TYPE_LETTER_ONLY:
                      
          while(i<length){
                          
          int t=r.nextInt(123);
                          
          if((t>=97||(t>=65&&t<=90))&&(exChars==null||exChars.indexOf((char)t)<0)){
                              code.append((
          char)t);
                              i
          ++;    
                          }
                      }
                      
          break;
                  
                  
          //數(shù)字、大寫(xiě)字母、小寫(xiě)字母混合
                  case TYPE_ALL_MIXED:
                      
          while(i<length){
                          
          int t=r.nextInt(123);
                          
          if((t>=97||(t>=65&&t<=90)||(t>=48&&t<=57))&&(exChars==null||exChars.indexOf((char)t)<0)){
                              code.append((
          char)t);
                              i
          ++;
                          }
                      }
                      
          break;    
                      
                  
          //數(shù)字、大寫(xiě)字母混合
                  case TYPE_NUM_UPPER:
                      
          while(i<length){
                          
          int t=r.nextInt(91);
                          
          if((t>=65||(t>=48&&t<=57))&&(exChars==null||exChars.indexOf((char)t)<0)){
                              code.append((
          char)t);
                              i
          ++;
                          }
                      }
                      
          break;        
                      
                  
          //數(shù)字、小寫(xiě)字母混合
                  case TYPE_NUM_LOWER:
                      
          while(i<length){
                          
          int t=r.nextInt(123);
                          
          if((t>=97||(t>=48&&t<=57))&&(exChars==null||exChars.indexOf((char)t)<0)){
                              code.append((
          char)t);
                              i
          ++;
                          }
                      }
                      
          break;        
                      
                  
          //僅大寫(xiě)字母
                  case TYPE_UPPER_ONLY:
                      
          while(i<length){
                          
          int t=r.nextInt(91);
                          
          if((t>=65)&&(exChars==null||exChars.indexOf((char)t)<0)){
                              code.append((
          char)t);
                              i
          ++;
                          }
                      }
                      
          break;                
                      
                  
          //僅小寫(xiě)字母
                  case TYPE_LOWER_ONLY:
                      
          while(i<length){
                          
          int t=r.nextInt(123);
                          
          if((t>=97)&&(exChars==null||exChars.indexOf((char)t)<0)){
                              code.append((
          char)t);
                              i
          ++;
                          }
                      }
                      
          break;                
                  
                  }
                  
                  
          return code.toString();
              }

              
              
          /**
               * 已有驗(yàn)證碼,生成驗(yàn)證碼圖片
               * 
          @param textCode 文本驗(yàn)證碼
               * 
          @param width 圖片寬度
               * 
          @param height 圖片高度
               * 
          @param interLine 圖片中干擾線的條數(shù)
               * 
          @param randomLocation 每個(gè)字符的高低位置是否隨機(jī)
               * 
          @param backColor 圖片顏色,若為null,則采用隨機(jī)顏色
               * 
          @param foreColor 字體顏色,若為null,則采用隨機(jī)顏色
               * 
          @param lineColor 干擾線顏色,若為null,則采用隨機(jī)顏色
               * 
          @return 圖片緩存對(duì)象
               
          */
              
          public static BufferedImage generateImageCode(String textCode,int width,int height,int interLine,boolean randomLocation,Color backColor,Color foreColor,Color lineColor){
                  
                  
                  BufferedImage bim
          =new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
                  Graphics g
          =bim.getGraphics();
                  
                  
          //畫(huà)背景圖
                  g.setColor(backColor==null?getRandomColor():backColor);
                  g.fillRect(
          0,0,width,height);
                  
                  
          //畫(huà)干擾線
                  Random r=new Random();
                  
          if(interLine>0){
              
                      
          int x=0,y=0,x1=width,y1=0;
                      
          for(int i=0;i<interLine;i++){
                          g.setColor(lineColor
          ==null?getRandomColor():lineColor);
                          y
          =r.nextInt(height);
                          y1
          =r.nextInt(height);
              
                          g.drawLine(x,y,x1,y1);
                      }
                  }
                  
                  
          //寫(xiě)驗(yàn)證碼
                  
                  
          //字體大小為圖片高度的80%
                  int fsize=(int)(height*0.8);
                 
          int fx=0;
                  
          int fy=fsize;

                  g.setFont(
          new Font(Font.DIALOG,Font.PLAIN,fsize));
                  
                  
          //寫(xiě)驗(yàn)證碼字符
                  for(int i=0;i<textCode.length();i++){
                      fy
          =randomLocation?(int)((Math.random()*0.3+0.6)*height):fy;//每個(gè)字符高低是否隨機(jī)
                      g.setColor(foreColor==null?getRandomColor():foreColor);
                      g.drawString(textCode.charAt(i)
          +"",fx,fy);
                      fx+=(width / textCode.length()) * (Math.random() * 0.3 + 0.8); //星風(fēng)兄的高見(jiàn),依據(jù)寬度浮動(dòng)
                  }

                  
                  g.dispose();
                  
                  
          return bim;
              }

              
              
          /**
               * 產(chǎn)生隨機(jī)顏色
               * 
          @return
               
          */
              
          private static Color getRandomColor(){
                  Random r
          =new Random();
                  Color c
          =new Color(r.nextInt(256),r.nextInt(256),r.nextInt(256));
                  
          return c;
              }
            


          }

          4、org.javachina.servlet.VerifyCodeServlet.java 接受客戶端請(qǐng)求,向客戶端輸出驗(yàn)證碼
              public void doGet(HttpServletRequest request, HttpServletResponse response)
                      
          throws ServletException, IOException {

                  
                  
          //設(shè)置瀏覽器不緩存本頁(yè)
                  response.setHeader("Cache-Control""no-cache");
                  
                  
          //生成驗(yàn)證碼,寫(xiě)入用戶session
                  String verifyCode=VerifyCode.generateTextCode(VerifyCode.TYPE_UPPER_ONLY,4,null);
                  request.getSession().setAttribute(
          "verifyCode",verifyCode);
                  
                  
          //輸出驗(yàn)證碼給客戶端
                  response.setContentType("image/jpeg");
                  BufferedImage bim
          =VerifyCode.generateImageCode(verifyCode, 90303,true,Color.WHITE,Color.BLACK,null);
                  ImageIO.write(bim, 
          "JPEG",response.getOutputStream());    
                  
              }

          5、org.javachina.servlet.PubMsgServlet.java 保存留言信息(比對(duì)驗(yàn)證碼)
              public void doGet(HttpServletRequest request, HttpServletResponse response)
                      
          throws ServletException, IOException {
                  
                  
          //得到留言標(biāo)題、內(nèi)容及用戶輸入的驗(yàn)證碼
                  String msgTitle=request.getParameter("msgTitle");
                  String msgContent
          =request.getParameter("msgContent");
                  String verifyCode
          =request.getParameter("verifyCode");
                  
                  
          //取session中的正確驗(yàn)證碼
                  String legalCode=null;
                  
          if(request.getSession().getAttribute("verifyCode")!=null)
                      legalCode
          =(String)(request.getSession().getAttribute("verifyCode"));
              
                  String next;
                  
                  
          //比較session中的驗(yàn)證碼與用戶輸入是否一致(這里忽略了大小寫(xiě))
                  if(verifyCode!=null&&verifyCode.equalsIgnoreCase(legalCode)){
                      
                      
          /*
                       * 保存留言內(nèi)容(省略)
                       
          */
                      
                      
          //指定下一個(gè)URL
                      next=request.getContextPath()+"/ok.jsp";
                      
                  }
          else
                      next
          ="this";
                  
                  response.setContentType(
          "text/plain");
                  PrintWriter out 
          = response.getWriter();
                  out.print(next);
                  out.flush();
                  out.close();
                  
              }


          以上源碼、文檔下載地址: http://download.csdn.net/source/1851509

          以上,望拋磚引玉,歡迎交流:hufoking@hotmail.com!



          posted on 2009-11-27 14:03 IknowIT 閱讀(4044) 評(píng)論(13)  編輯  收藏

          評(píng)論

          # re: Java通用驗(yàn)證碼程序及應(yīng)用示例(提供源碼下載) 2009-11-27 17:09 零全零美

          多謝博主寫(xiě)出這么好的總結(jié),如果能加上漢字驗(yàn)證碼,會(huì)更完美!  回復(fù)  更多評(píng)論   

          # re: Java通用驗(yàn)證碼程序及應(yīng)用示例(提供源碼下載) 2009-11-27 17:14 鵬飛liu

          我最近也要用到驗(yàn)證碼,但是不知道是直接調(diào)用jsp文件的形式還是servlet方式好一些,請(qǐng)指教!謝謝  回復(fù)  更多評(píng)論   

          # re: Java通用驗(yàn)證碼程序及應(yīng)用示例(提供源碼下載)[未登錄](méi) 2009-11-27 17:15 IKnowIT

          多謝零全零美的建議!有時(shí)間把漢字驗(yàn)證碼功能以及背景圖片隨機(jī)打點(diǎn)功能加上。  回復(fù)  更多評(píng)論   

          # re: Java通用驗(yàn)證碼程序及應(yīng)用示例(提供源碼下載)[未登錄](méi) 2009-11-27 17:17 IKnowIT

          @鵬飛liu
          也可以在jsp里直接寫(xiě)代碼(或調(diào)用其他類(lèi))生成驗(yàn)證碼,我習(xí)慣把這類(lèi)的功能封裝成工具類(lèi),便于在各種情況下重用。  回復(fù)  更多評(píng)論   

          # re: Java通用驗(yàn)證碼程序及應(yīng)用示例(提供源碼下載) 2009-11-28 23:10 bzp

          不用session來(lái)傳遞驗(yàn)證碼,行不行呢?當(dāng)訪問(wèn)量比較大的時(shí)候,最好是盡量減少session的數(shù)量比較好  回復(fù)  更多評(píng)論   

          # re: Java通用驗(yàn)證碼程序及應(yīng)用示例(提供源碼下載) 2009-11-28 23:12 bzp

          不用session來(lái)傳遞驗(yàn)證碼,如何做?  回復(fù)  更多評(píng)論   

          # re: Java通用驗(yàn)證碼程序及應(yīng)用示例(提供源碼下載) 2009-11-29 11:49 零全零美

          不用session那也只能用cookie了,頁(yè)面展示的時(shí)候把驗(yàn)證碼寫(xiě)入cookie,并設(shè)置適當(dāng)?shù)挠行冢峤坏臅r(shí)候再驗(yàn)證cookie里面的相應(yīng)值!
          不過(guò)我感覺(jué),如果不是訪問(wèn)量大到離譜,用session存一下驗(yàn)證碼也并沒(méi)有什么不妥!  回復(fù)  更多評(píng)論   

          # re: Java通用驗(yàn)證碼程序及應(yīng)用示例(提供源碼下載) 2009-11-29 22:39 星風(fēng)

          一些小瑕疵:
          1.生成圖片時(shí),傳入的寬度沒(méi)用上導(dǎo)致寬度過(guò)小時(shí)字符超出圖片寬度。
          // 寫(xiě)驗(yàn)證碼字符
          ...
          // fx += fsize * 0.9; // 原代碼
          // 根據(jù)傳入寬度調(diào)整字距并隨機(jī)±20%浮動(dòng)
          fx += (width / textCode.length()) * (Math.random() * 0.4 + 0.8);
          ...

          2.VerifyCode.generateImageCode()的第二個(gè)重載無(wú)法拿到隨機(jī)生成的字符串,沒(méi)有任何意義。可以增加一個(gè)方法getLastTextCode()獲取但又必須保證線程安全,還不如刪掉。

          3.隨機(jī)顏色里
          Color c = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255));
          應(yīng)該是256

          4.生成驗(yàn)證碼字符串的那一大段swich完全可以簡(jiǎn)化,這樣太繁冗了。
          可以這樣寫(xiě)(只是一個(gè)思路,沒(méi)有測(cè)試):
          // 添加一個(gè)靜態(tài)字段
          static char[] chars = {數(shù)字,大寫(xiě)字母,小寫(xiě)字母};
          ...
          // 方法內(nèi)替換switch
          int begin = 0;
          int end = 0;
          switch (type) {
          case TYPE_NUM_ONLY:
          begin = 0;
          end = 10; // 第10個(gè)不是數(shù)字
          break;
          // 其他的case...
          }
          while (i < length) {
          int t = r.nextInt(end - begin); // 如果end設(shè)為9,這里要+1
          code.append(chars[t + begin]);
          i++;
          }
          ...


          最后感謝樓主的分享。  回復(fù)  更多評(píng)論   

          # re: Java通用驗(yàn)證碼程序及應(yīng)用示例(提供源碼下載)[未登錄](méi) 2009-11-30 10:29 IKnowIT

          @星風(fēng)
          多謝您的意見(jiàn),受教了。

          第1條:非常高明,我原來(lái)沒(méi)有考慮到,已經(jīng)修改。多謝!
          具體浮動(dòng)的數(shù),上浮20%有時(shí)字符會(huì)超出邊界,測(cè)試一下可能:fx += (width / textCode.length()) * (Math.random() * 0.3 + 0.8); //0.4改為0.3更合適。

          第2條:原是想對(duì)外提供一個(gè)直接生成圖片的方法,但正如兄所說(shuō),如果用戶沒(méi)有textCode確實(shí)也沒(méi)用。已經(jīng)去掉。

          第3條:應(yīng)該是256,值包括255.

          第4條:有一定道理,只是當(dāng)驗(yàn)證碼是兩兩混合或者三者混合時(shí),需要考慮到驗(yàn)證碼的每個(gè)數(shù)都是從其中隨機(jī)抽取的,實(shí)際寫(xiě)起來(lái)代碼量可能也不少。

          最后,非常感謝如星風(fēng)兄此好的建議,受益匪淺。  回復(fù)  更多評(píng)論   

          # re: Java通用驗(yàn)證碼程序及應(yīng)用示例(提供源碼下載) 2010-09-26 10:03 來(lái)訪者

          謝謝  回復(fù)  更多評(píng)論   

          # re: Java通用驗(yàn)證碼程序及應(yīng)用示例(提供源碼下載) 2012-04-16 16:36 宋軍明

          多發(fā)點(diǎn)  回復(fù)  更多評(píng)論   

          # re: Java通用驗(yàn)證碼程序及應(yīng)用示例(提供源碼下載) 2014-05-05 21:14 zuidaima

          可以參考代碼:java隨機(jī)動(dòng)態(tài)生成漢字驗(yàn)證碼圖片的實(shí)例代碼分享,下載地址:http://www.zuidaima.com/share/1809721113234432.htm  回復(fù)  更多評(píng)論   

          # re: Java通用驗(yàn)證碼程序及應(yīng)用示例(提供源碼下載) 2014-07-14 15:03 劉鵬

          樓主,為什么我把代碼都復(fù)制了,驗(yàn)證碼不顯示呢?顯示的是個(gè)x  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          最新評(píng)論

          主站蜘蛛池模板: 正安县| 陆良县| 抚顺市| 马鞍山市| 安远县| 哈巴河县| 桐庐县| 淮北市| 汝阳县| 上虞市| 敖汉旗| 阿尔山市| 五华县| 利川市| 积石山| 绥阳县| 咸丰县| 鄂托克旗| 方正县| 洛隆县| 南川市| 定日县| 论坛| 石屏县| 麦盖提县| 松原市| 浪卡子县| 彩票| 云和县| 澄迈县| 阜阳市| 甘南县| 额济纳旗| 灵丘县| 无锡市| 鹿泉市| 土默特左旗| 砚山县| 磐安县| 佛教| 武陟县|