posts - 0, comments - 77, trackbacks - 0, articles - 356
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          隨機數(shù)字驗證碼的生成

          Posted on 2007-09-27 14:29 semovy 閱讀(557) 評論(0)  編輯  收藏 所屬分類: ServletJ2EE綜合

          有時候在我們的網(wǎng)絡(luò)應(yīng)用中,防止程序自動登錄搞破壞,我們一般都會加上驗證碼,這些驗證碼一般來說都是由人來識別的,當(dāng)然,如果驗證碼很有規(guī)律,或者說很清楚,漂亮,那么也是可能被程序識別的,我以前就識別過某網(wǎng)站的驗證碼,因為比較有規(guī)律,所以被識別了,并且識別率達到99%左右,其實我們可以制作很復(fù)雜一點的驗證碼,添加一些干擾的線條或者字體變形,使程序識別的難度加大,這樣,我們的目的也就達到了.

          下面是生成的圖片:


          代碼如下,JSP代碼

          <%@page contentType="image/jpeg"%>
          <%@page pageEncoding="UTF-8"%>
          <%@ page import="java.awt.*,javax.imageio.*,java.io.*,java.util.*,java.awt.image.*" %>
          <%--
          The taglib directive below imports the JSTL library. If you uncomment it,
          you must also add the JSTL library to the project. The Add Library action
          on Libraries node in Projects view can be used to add the JSTL 
          1.1 library.
          --%>
          <%--
          <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
          --%>

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
          "http://www.w3.org/TR/html4/loose.dtd">
          <%!String s="";%>
          <%
          java.util.List
          <String> fonts=new ArrayList<String>();
          GraphicsEnvironment.getLocalGraphicsEnvironment().preferLocaleFonts();
          String[] names
          =GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(Locale.CHINA);
          for(String s:names){
              
          char c=s.charAt(0);
              
          if(Character.isLowerCase(c)||Character.isUpperCase(c)){
                  
              }
          else{
                  fonts.add(s);
              }
          }
          BufferedImage bi
          =new BufferedImage(200,50,BufferedImage.TYPE_INT_RGB);
          Graphics2D g
          =bi.createGraphics();
          char[] cs={'0','1','2','3','4','5','6','7','8','9'};
          char[] use=new char[4];
          g.setColor(
          new Color(240,240,240));
          g.fillRect(
          0,0,200,50);
          for(int i=0;i<4;i++){
              Point p
          =new Point(5+(i*((int)(Math.random()*10)+40)),40);
              
          int size=0;
              
          int[] sizes=new int[20];
              
          for(int j=0;j<20;j++){
                  sizes[j]
          =30+j;
              }
              size
          =sizes[(int)(Math.random()*sizes.length)];
              
          int face=0;
              
          if(Math.random()*10>5){
                  face
          =Font.BOLD;
              }
          else{
                  face
          =Font.ITALIC;
              }
              use[i]
          =cs[(int)(Math.random()*cs.length)];
              g.setPaint(
          new GradientPaint(p.x,p.y,new Color((int)(Math.random()*256),0,(int)(Math.random()*256)),
                      p.x,p.y
          -size,new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256))));
              g.setFont(
          new Font(fonts.get((int)(Math.random()*fonts.size())),face,size));
              g.drawString(
          ""+use[i],p.x,p.y);
          }
          s
          =new String(use);
          session.setAttribute(
          "code", s);
          g.setPaint(
          null);
          for(int i=0;i<4;i++){
              g.setColor(
          new Color((int)(Math.random()*0x00FFFFFFF)));
              g.drawLine((
          int)(Math.random()*200),(int)(Math.random()*50),(int)(Math.random()*200),(int)(Math.random()*50));
          }
          Random random 
          = new Random();
          for (int i=0;i<88;i++) {
              
          int x = random.nextInt(200);
              
          int y = random.nextInt(50);
              g.setColor(
          new Color((int)(Math.random()*0x00FFFFFFF)));
              g.setStroke(
          new BasicStroke((float)(Math.random()*3)));
              g.drawLine(x,y,x,y);
          }
          OutputStream ot
          =response.getOutputStream();
          ImageIO.write(bi,
          "JPEG",ot);
          g.dispose();
          ot.close();
          %>

          以下是Servlet代碼
          /*
           * Code.java
           *
           * Created on 2007年9月21日, 下午12:08
           
          */

          package com.hadeslee;

          import java.awt.BasicStroke;
          import java.awt.Color;
          import java.awt.Font;
          import java.awt.GradientPaint;
          import java.awt.Graphics2D;
          import java.awt.GraphicsEnvironment;
          import java.awt.Paint;
          import java.awt.Point;
          import java.awt.Stroke;
          import java.awt.image.BufferedImage;
          import java.io.*;
          import java.util.ArrayList;
          import java.util.List;
          import java.util.Locale;
          import java.util.Random;
          import javax.imageio.ImageIO;

          import javax.servlet.*;
          import javax.servlet.http.*;

          /**
           *
           * 
          @author lbf
           * 
          @version
           
          */
          public class Code extends HttpServlet {
              
              
          /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
               * 
          @param request servlet request
               * 
          @param response servlet response
               
          */
              
          private List<String> fonts=new ArrayList<String>();
              
          public Code(){
                  initFonts();
              }
              
          private void initFonts(){
                  GraphicsEnvironment.getLocalGraphicsEnvironment().preferLocaleFonts();
                  String[] names
          =GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(Locale.CHINA);
                  
          for(String s:names){
                      
          char c=s.charAt(0);
                      
          if(Character.isLowerCase(c)||Character.isUpperCase(c)){
                          
                      }
          else{
                          fonts.add(s);
                      }
                  }
              }
              
          protected void processRequest(HttpServletRequest request, HttpServletResponse response)
              
          throws ServletException, IOException {
                  response.setContentType(
          "image/jpeg;charset=UTF-8");
                  OutputStream out
          =response.getOutputStream();
                  BufferedImage bi
          =new BufferedImage(200,50,BufferedImage.TYPE_INT_RGB);
                  Graphics2D g
          =bi.createGraphics();
                  
          char[] cs={'0','1','2','3','4','5','6','7','8','9'};
                  
          char[] use=new char[4];
                  g.setColor(
          new Color(240,240,240));
                  g.fillRect(
          0,0,200,50);
                  
          for(int i=0;i<4;i++){
                      Point p
          =getPoint(i);
                      
          int size=getSize();
                      use[i]
          =cs[(int)(Math.random()*cs.length)];
                     
          // g.setColor(new Color((int)(Math.random()*256),0,(int)(Math.random()*256)));
                      g.setPaint(getPaint(p,size));
                      g.setFont(
          new Font(fonts.get((int)(Math.random()*fonts.size())),getFace(),size));
                      g.drawString(
          ""+use[i],p.x,p.y);
                  }
                  g.setStroke(
          new BasicStroke(1.0f));
                  g.setPaint(
          null);
                  
          for(int i=0;i<4;i++){
                      g.setColor(
          new Color((int)(Math.random()*0x00FFFFFFF)));
                      g.drawLine((
          int)(Math.random()*200),(int)(Math.random()*50),(int)(Math.random()*200),(int)(Math.random()*50));
                  }
                  Random random 
          = new Random();
                  
          for (int i=0;i<88;i++) {
                      
          int x = random.nextInt(200);
                      
          int y = random.nextInt(50);
                      g.setColor(
          new Color((int)(Math.random()*0x00FFFFFFF)));
                      g.setStroke(getStroke());
                      g.drawLine(x,y,x,y);
                  }
                  ImageIO.write(bi,
          "JPEG",out);
                  out.close();
                  g.dispose();
              }
              
          private Stroke getStroke(){
                BasicStroke bs
          =new BasicStroke((float)(Math.random()*3));
                
          return bs;
              }
              
          private Point getPoint(int index){
                  
          return new Point(5+(index*((int)(Math.random()*10)+40)),40);
              }
              
          private Paint getPaint(Point p,int size){
                  GradientPaint gp
          =new GradientPaint(p.x,p.y,new Color((int)(Math.random()*256),0,(int)(Math.random()*256)),
                          p.x,p.y
          -size,new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256)));
                  
          return gp;
              }
              
          private int getFace(){
                  
          if(Math.random()*10>5){
                      
          return Font.BOLD;
                  }
          else{
                      
          return Font.ITALIC;
                  }
              }
              
          private int getSize(){
                  
          int[] sizes=new int[20];
                  
          for(int i=0;i<20;i++){
                      sizes[i]
          =30+i;
                  }
                  
          return sizes[(int)(Math.random()*sizes.length)];
              }
              
              
          // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
              /** Handles the HTTP <code>GET</code> method.
               * 
          @param request servlet request
               * 
          @param response servlet response
               
          */
              
          protected void doGet(HttpServletRequest request, HttpServletResponse response)
              
          throws ServletException, IOException {
                  processRequest(request, response);
              }
              
              
          /** Handles the HTTP <code>POST</code> method.
               * 
          @param request servlet request
               * 
          @param response servlet response
               
          */
              
          protected void doPost(HttpServletRequest request, HttpServletResponse response)
              
          throws ServletException, IOException {
                  processRequest(request, response);
              }
              
              
          /** Returns a short description of the servlet.
               
          */
              
          public String getServletInfo() {
                  
          return "Short description";
              }
              
          // </editor-fold>
          }


          在這里我們先得到了服務(wù)器所在的系統(tǒng)的字體,并用這些字體生成不同的字符,然后再隨機設(shè)大小,隨機變形,然后為字體加上漸變,并給整個圖片添加干擾線條以及干擾點.讓程序識別的難度加大.

          呵呵,我們可以把它改成字母或者中文的驗證,道理都是一樣的,只不過在生成的時候,不一定用數(shù)字了,而是用所有可以輸入的文字.這樣,被程序識別的可能又小了.

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 满洲里市| 翁源县| 平和县| 渝北区| 鱼台县| 阿图什市| 济源市| 伊宁县| 成安县| 西平县| 屏南县| 罗山县| 锡林浩特市| 临湘市| 嘉祥县| 合作市| 波密县| 昭通市| 正阳县| 禄劝| 景谷| 绥化市| 江孜县| 开封市| 诏安县| 南雄市| 尉犁县| 临海市| 江油市| 五台县| 永新县| 高雄市| 乳山市| 平乐县| 永胜县| 稻城县| 西和县| 德昌县| 临颍县| 平乐县| 北碚区|