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

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

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

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

    隨機數字驗證碼的生成

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

    有時候在我們的網絡應用中,防止程序自動登錄搞破壞,我們一般都會加上驗證碼,這些驗證碼一般來說都是由人來識別的,當然,如果驗證碼很有規律,或者說很清楚,漂亮,那么也是可能被程序識別的,我以前就識別過某網站的驗證碼,因為比較有規律,所以被識別了,并且識別率達到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>
    }


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

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

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲成熟丰满熟妇高潮XXXXX| 亚洲黄色在线观看视频| 亚洲成在人线在线播放无码| www.黄色免费网站| 亚洲精品国产福利片| 95老司机免费福利| 亚洲大香伊人蕉在人依线| 亚洲黄色免费电影| ASS亚洲熟妇毛茸茸PICS| 国外成人免费高清激情视频 | 亚洲AV无码久久精品狠狠爱浪潮| 成人A毛片免费观看网站| 亚洲第一福利视频| 24小时免费看片| 美女视频黄免费亚洲| 又黄又大又爽免费视频| 一级做a爰片久久毛片免费陪| 亚洲一区精品伊人久久伊人 | free哆拍拍免费永久视频| 亚洲国产精品特色大片观看完整版| 91在线免费观看| 亚洲综合久久成人69| 免费观看男人免费桶女人视频 | 亚洲国产精品无码中文字| 久久WWW免费人成一看片| 亚洲av无码有乱码在线观看| 亚洲Aⅴ无码一区二区二三区软件 亚洲AⅤ视频一区二区三区 | 免费看韩国黄a片在线观看| 国产产在线精品亚洲AAVV| 亚洲一区二区三区无码影院| 7x7x7x免费在线观看| 2020国产精品亚洲综合网 | 亚洲AV色香蕉一区二区| 青娱乐免费在线视频| 国产亚洲精品第一综合| 久久精品国产亚洲av成人| 在线免费视频一区二区| 中文字幕免费在线观看动作大片 | 水蜜桃视频在线观看免费| 亚洲国产精品国自产拍电影| 国产美女在线精品免费观看|