<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    千里冰封
    JAVA 濃香四溢
    posts - 151,comments - 2801,trackbacks - 0

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

    下面是生成的圖片:


    代碼如下,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>
    }


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

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


    盡管千里冰封
    依然擁有晴空

    你我共同品味JAVA的濃香.
    posted on 2007-09-21 13:05 千里冰封 閱讀(2230) 評論(10)  編輯  收藏 所屬分類: JAVAEE

    FeedBack:
    # re: 隨機數字驗證碼的生成
    2007-09-21 14:06 | sitinspring
    作個記號,用到時再來細看.  回復  更多評論
      
    # re: 隨機數字驗證碼的生成
    2007-09-21 16:06 | zht
    還有另外一種方式是根據隨機數從服務器上取圖片然后再畫出來,
    感覺這樣數字的風格可以隨時換  回復  更多評論
      
    # re: 隨機數字驗證碼的生成[未登錄]
    2007-09-21 17:00 | a
    good  回復  更多評論
      
    # re: 隨機數字驗證碼的生成[未登錄]
    2007-09-22 09:26 | quaff
    thanks  回復  更多評論
      
    # re: 隨機數字驗證碼的生成
    2007-09-22 21:45 | cocobear
    可不可以寫一個識別你這個驗證碼的程序呢?呵呵  回復  更多評論
      
    # re: 隨機數字驗證碼的生成
    2007-09-23 14:14 | Alexander.Yu
    不錯...強啊.  回復  更多評論
      
    # re: 隨機數字驗證碼的生成
    2007-09-27 17:16 | 彭俊
    我也想聽聽你關于如何識別驗證碼的基本思路,沒有干擾也好。請教要如何識別呢?  回復  更多評論
      
    # re: 隨機數字驗證碼的生成
    2007-09-27 17:27 | 千里冰封
    @彭俊
    最基本的思路就是比對,先提取出來字模,然后再比對就可以了  回復  更多評論
      
    # re: 隨機數字驗證碼的生成
    2007-09-27 17:37 | 彭俊
    @千里冰封
    抽點時間寫寫這個內容吧 呵呵
    這方面接觸的比較少 簡單的說一下沒有感覺啊
    來點直接的Code,肯定有不少人期待呢
    當然我也會取search一下先做做功課的
    先謝謝了  回復  更多評論
      
    # re: 隨機數字驗證碼的生成
    2007-09-27 17:47 | 千里冰封
    @彭俊
    呵呵,好吧,我就把去年寫的拿出來分享一下  回復  更多評論
      
    主站蜘蛛池模板: 亚洲精品无码一区二区| 又黄又爽无遮挡免费视频| 亚洲精品白浆高清久久久久久 | 久9热免费精品视频在线观看| 成**人免费一级毛片| 亚洲一区在线视频| 中文字幕免费视频一| 亚洲国产美女精品久久久久| 国产精品久久久久久久久免费| 亚洲伦另类中文字幕| 97在线视频免费播放| 亚洲av网址在线观看| 91福利免费体验区观看区| 亚洲精品中文字幕无码AV| 国产卡一卡二卡三免费入口| 亚洲 欧洲 视频 伦小说| 日本免费一本天堂在线| 有色视频在线观看免费高清在线直播| 久久久久亚洲AV综合波多野结衣| 狠狠躁狠狠爱免费视频无码| 久久精品国产亚洲AV麻豆王友容| 1000部拍拍拍18勿入免费视频下载 | 久久精品国产亚洲av麻豆蜜芽| 免费一本色道久久一区| 野花视频在线官网免费1| 亚洲日韩精品无码一区二区三区 | 亚洲国产精品ⅴa在线观看| 亚洲av麻豆aⅴ无码电影| 两性色午夜免费视频| 亚洲二区在线视频| 国产国产成年年人免费看片| 丝袜捆绑调教视频免费区| 亚洲精品中文字幕无乱码| 免费看国产曰批40分钟| 免费国产成人18在线观看| 四虎亚洲精品高清在线观看| 亚洲色一色噜一噜噜噜| 69式国产真人免费视频| 美女的胸又黄又www网站免费| 亚洲大成色www永久网站| 2021久久精品免费观看|