java的動態驗證碼單線設計

来源:https://www.cnblogs.com/shuiqian/archive/2018/07/22/9352161.html
-Advertisement-
Play Games

1.java的動態驗證碼我這裡將介紹兩種方法: 一:根據java本身提供的一種驗證碼的寫法,這種呢只限於大家瞭解就可以了,因為java自帶的模式編寫的在實際開發中是沒有意義的,所以只供學習一下就可以了,待會講解的第二種呢就是我們需要掌握的一種模式了: 第一種的代碼如下: 上面的代碼呢寫的很詳細了,這 ...


1.java的動態驗證碼我這裡將介紹兩種方法:

根據java本身提供的一種驗證碼的寫法,這種呢只限於大家瞭解就可以了,因為java自帶的模式編寫的在實際開發中是沒有意義的,所以只供學習一下就可以了,待會講解的第二種呢就是我們需要掌握的一種模式了:

第一種的代碼如下:

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

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class inde
 */
@WebServlet("/inde")
public class inde extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public inde() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
            this.doPost(request, response);            
    }

    /**動態生成圖片驗證碼
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        //創建圖像
        int width=100;
        int height=40;
        //圖片的大小設置
        BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        //創建畫板        
        Graphics g=image.getGraphics();    
        
         setSquareBackGround(g,width,height,5);
        //確定畫筆顏色
        g.setColor(Color.black);
        //填充矩形
        g.fillRect(0, 0, width, height);
            //在大矩形中放小矩形
            g.setColor(Color.WHITE);
            g.fillRect(1, 1, width-2, height-2);                
        //填充字元
        String str = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789";
        StringBuffer sb=new StringBuffer();
         //畫隨機干擾框
        setSquareBackGround(g,width,height,3); 
       //畫干擾點
       CreateRandomPoint(width, height,100,g,100);       
       //隨機畫幾條線
       CreateRandomLine(width, height,8,g,100);    
        //隨機獲取4個字元
        Random random=new Random();
        for (int i = 0; i < 4; i++) {
            //62個填充字元裡面隨機的隨機的收取字元
            int index=random.nextInt(62);
            //截取一個字元
            String st=str.substring(index, index+1);
            //把字元放到圖片中去
            g.setColor(Color.red);
            //設置字體
            g.setFont(new Font("宋體",Font.BOLD,30));
            g.drawString(st, 20*i, 30);//防止4個字元在一起
            sb.append(st);
        }
        
        //把StringBuffer中的驗證碼放到session裡面,目的是讓Login調用
        HttpSession se=request.getSession();
        se.setAttribute("number", sb.toString());
        
        
        //發送圖片到瀏覽器 指定發送的圖片 和格式
        response.setContentType("image/jpeg");
        //圖片,圖片的格式,輸出的方式
        ImageIO.write(image, "jpg", response.getOutputStream());
                
    }
    Random rand = new Random();
    private void CreateRandomPoint(int width,int height,int many,Graphics g,int alpha)
    {  // 隨機產生干擾點
        for (int i=0;i<many;i++) {
            int x = rand.nextInt(width); 
            int y = rand.nextInt(height); 
            g.setColor(getColor(alpha));
            g.drawOval(x,y,rand.nextInt(3),rand.nextInt(3)); 
        } 
    }
/**
 * 隨機產生干擾線條
 * @param width
 * @param height
 * @param minMany 最少產生的數量
 * @param g
 * @param alpha 透明度0~255 0表示全透
 */
    private void CreateRandomLine(int width,int height,int minMany,Graphics g,int alpha)
    {  // 隨機產生干擾線條
        for (int i=0;i<getIntRandom(minMany, minMany+6);i++) { 
            int x1 =getIntRandom(0,(int)(width*0.6)); 
            int y1 =getIntRandom(0,(int)(height*0.6)); 
            int x2 =getIntRandom((int)(width*0.4),width); 
            int y2 =getIntRandom((int)(height*0.2),height);  
            g.setColor(getColor(alpha));
            g.drawLine(x1, y1, x2, y2);
        } 
    }
    
    /**
     * 由隨機產生的方塊來作為干擾背景
     */
    private void setSquareBackGround(Graphics g,int width,int height,int count){
        // 隨機產生干擾線條
        for (int i=0;i<getIntRandom(count, count+2);i++) { 
            int x1 =getIntRandom(0,(int)(width*0.3)); 
            int y1 =getIntRandom(0,(int)(height*0.3)); 
            int x2 =getIntRandom((int)(width*0.5),width); 
            int y2 =getIntRandom((int)(height*0.55),height);  
            g.setColor(getColor(100));
            int w=x2-x1;
            int h=y2-y1;
            if(w<0) w=-w;
            if(h<0) h=-h;
            g.drawRect(x1, y1, w, h);
            g.setColor(getColor(25));
            g.fillRect(x1, y1, w, h);
        } 
    }
    private int getIntRandom(double start,double end)
    {   if(end<start)
        {
          double t=end;
          end=start;
          start=t;
        }
        double i=start+(int) (Math.random()*(end-start));
        return (int)i;
    }
    
   

 

 

 

上面的代碼呢寫的很詳細了,這裡我就不重覆了,這裡的干擾線條是有很多寫法的,我這裡就沒有全寫出來,有需要的話可以私聊我哦!

下麵介紹第二種:

這種呢是我們開發中是可以用得到的,使用在的是網頁端的交互,我們在登錄網站的時候有很多的驗證碼就可以用這個來寫了

 

 

import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class inde
 */
@WebServlet("/inde")
public class inde extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public inde() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
            this.doPost(request, response);            
    }

    /**動態生成圖片驗證碼
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        //創建圖像
        int width=100;
        int height=40;
        //圖片的大小設置
        BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        //創建畫板        
        Graphics g=image.getGraphics();    
        
         setSquareBackGround(g,width,height,5);
        //確定畫筆顏色
        g.setColor(Color.black);
        //填充矩形
        g.fillRect(0, 0, width, height);
            //在大矩形中放小矩形
            g.setColor(Color.WHITE);
            g.fillRect(1, 1, width-2, height-2);                
        //填充字元
        String str = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789";
        StringBuffer sb=new StringBuffer();
//隨機獲取4個字元
        Random random=new Random();
        for (int i = 0; i < 4; i++) {
            //62個填充字元裡面隨機的隨機的收取字元
            int index=random.nextInt(62);
            //截取一個字元
            String st=str.substring(index, index+1);
            //把字元放到圖片中去
            g.setColor(Color.red);
            //設置字體
            g.setFont(new Font("宋體",Font.BOLD,30));
            g.drawString(st, 20*i, 30);//防止4個字元在一起
            sb.append(st);
        }
//把StringBuffer中的驗證碼放到session裡面,目的是讓Login調用
        HttpSession se=request.getSession();
        se.setAttribute("number", sb.toString());
        
        
        //發送圖片到瀏覽器 指定發送的圖片 和格式
        response.setContentType("image/jpeg");
        //圖片,圖片的格式,輸出的方式
        ImageIO.write(image, "jpg", response.getOutputStream());
                
    }



這樣就可以運行了,當然了我們可以在這裡面加入第一種的干擾模塊給拿過來這樣就可以實現整體的一個效果了

以上的代碼我都實驗過了,都是可以運行的,今天就想到這裡了,感謝大家的欣賞

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 介紹單例模式之前我們先來介紹下什麼是設計模式,所謂設計模式簡單來說就是根據開發者先輩們的經驗而總結出的解決問題的方式,可以說是前人經驗和心血的體現。 有了設計模式之後,我們可以少走很多彎路,利用設計模式來輕鬆解決對應的問題。 話不多說,今天先來介紹最容易入門和掌握的設計模式——單例模式 單例模式:我 ...
  • 在學完volatile和CAS之後,近幾天在擼AbstractQueuedSynchronizer(AQS)的源代碼,很多併發工具都是基於AQS來實現的,這也是併發專家Doug Lea的初衷,通過寫一個這樣的基礎工具來提高j.u.c的靈活性。具體可以看這篇論文的一段原文,我摘錄一下: As is w ...
  • Django模板系統 官方文檔:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#std:templatetag-for 常用語法 只需要記兩種特殊符號: {{ }}和 {% %} 變數相關的用{{}},邏輯相關的用{%%} ...
  • 主要內容: 1.JVM中分為哪幾個區 2.每個區用來存放什麼,每個分區的作用 3.什麼時候創建的 4.是線程私有的還是多個線程共用的 ...
  • 題目描述 給定一個由 nnn 行數字組成的數字梯形如下圖所示。 梯形的第一行有 mmm 個數字。從梯形的頂部的 mmm 個數字開始,在每個數字處可以沿左下或右下方向移動,形成一條從梯形的頂至底的路徑。 分別遵守以下規則: 從梯形的頂至底的 mmm 條路徑互不相交; 從梯形的頂至底的 mmm 條路徑僅 ...
  • 本文內容: 文件操作 文件過濾器 首發日期:2018-07-23 文件操作: Java中對文件和目錄的操作,通常通過File類來操作。 File類有幾個構造函數,常用的是下麵三個: File(String pathname):根據路徑名創建一個對象 File(String parent, Strin ...
  • [TOC]#30、第三周-第02章節-Python3.5-上節內容回顧1.列表,元組操作2.字元串操作3.字典操作#31、第三周-第03章節-Python3.5-集合及其運算##集合運算list_1 = [1,2,3,2]print("list_1:",list_1)set_1 = set(list ...
  • 1. 學習計劃 1、圖片上傳 a) 圖片伺服器FastDFS b) 圖片上傳功能實現 2、富文本編輯器的使用KindEditor 3、商品添加功能完成 2. 圖片伺服器的安裝 1、存儲空間可擴展。 2、提供一個統一的訪問方式。 使用FastDFS,分散式文件系統。存儲空間可以橫向擴展,可以實現伺服器 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...