Java生成驗證碼

来源:http://www.cnblogs.com/yujie365/archive/2017/02/12/6391371.html
-Advertisement-
Play Games

Java 生成驗證碼的流程是: 收到請求 生成驗證碼所用的隨機數 使用隨機數寫出圖片 將隨機數記錄到Session中 輸出驗證碼 Java 驗證驗證碼的流程是: 收到請求 獲取用戶傳過來的驗證碼數字 驗證是否正確 輸出驗證結果 下麵通過一個例子來展示驗證碼的生成流程,該例子使用基本Java Spri ...


Java 生成驗證碼的流程是:

收到請求->生成驗證碼所用的隨機數->使用隨機數寫出圖片->將隨機數記錄到Session中->輸出驗證碼

Java 驗證驗證碼的流程是:

收到請求->獲取用戶傳過來的驗證碼數字->驗證是否正確->輸出驗證結果

下麵通過一個例子來展示驗證碼的生成流程,該例子使用基本Java Spring框架的Rest介面,可以使用任何平臺來獲取驗證碼:

伺服器處理驗證碼的例子:

1.接收驗證碼請求:

/**
 * 接收驗證碼請求
 */
@RequestMapping(value="captchacode")
public void CaptchaCode(){
    try {
        CaptchaCodeModel captchaCodeModel=new CaptchaCode().getCode();
        
        //將驗證碼放到Session中
        HttpServletRequest httpServletRequest=super.getRequest();
        httpServletRequest.getSession().setAttribute("captchacodekey", captchaCodeModel.getCaptchaCode());
        
        //將圖片寫到客戶端 
        HttpServletResponse httpServletResponse=super.getResponse();
        //禁止緩存
        httpServletResponse.setHeader("Pragma", "no-cache");
        httpServletResponse.setHeader("Cache-Control", "no-cache");
        httpServletResponse.setDateHeader("Expires", 0);
        
        ServletOutputStream servletOutputStream=httpServletResponse.getOutputStream();
        //輸出圖片
        ImageIO.write(captchaCodeModel.getCaptchaImage(), "jpeg", servletOutputStream);
        servletOutputStream.close();
    } catch (Exception e) {
        logger.info("驗證碼生成失敗:"+e.getMessage());
    }
}

2.生成驗證碼並生成圖片:
public class CaptchaCode {
private int width = 90;// 定義圖片的width
private int height = 20;// 定義圖片的height
private int codeCount = 4;// 定義圖片上顯示驗證碼的個數
private int xx = 15;
private int fontHeight = 18;
private int codeY = 16;
char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

public CaptchaCodeModel getCode() throws IOException {
    // 定義圖像buffer
    BufferedImage buffImg = new BufferedImage(width, height,
            BufferedImage.TYPE_INT_RGB);

    Graphics gd = buffImg.getGraphics();
    // 創建一個隨機數生成器類
    Random random = new Random();
    // 將圖像填充為白色
    gd.setColor(Color.WHITE);
    gd.fillRect(0, 0, width, height);

    // 創建字體,字體的大小應該根據圖片的高度來定。
    Font font = new Font("Fixedsys", Font.BOLD, fontHeight);
    // 設置字體。
    gd.setFont(font);

    // 畫邊框。
    gd.setColor(Color.BLACK);
    gd.drawRect(0, 0, width - 1, height - 1);

    // 隨機產生40條幹擾線,使圖象中的認證碼不易被其它程式探測到。
    gd.setColor(Color.BLACK);
    for (int i = 0; i < 40; i++) {
        int x = random.nextInt(width);
        int y = random.nextInt(height);
        int xl = random.nextInt(12);
        int yl = random.nextInt(12);
        gd.drawLine(x, y, x + xl, y + yl);
    }

    // randomCode用於保存隨機產生的驗證碼,以便用戶登錄後進行驗證。
    StringBuffer randomCode = new StringBuffer();
    int red = 0, green = 0, blue = 0;

    // 隨機產生codeCount數字的驗證碼。
    for (int i = 0; i < codeCount; i++) {
        // 得到隨機產生的驗證碼數字。
        String code = String.valueOf(codeSequence[random.nextInt(36)]);
        // 產生隨機的顏色分量來構造顏色值,這樣輸出的每位數字的顏色值都將不同。
        red = random.nextInt(255);
        green = random.nextInt(255);
        blue = random.nextInt(255);

        // 用隨機產生的顏色將驗證碼繪製到圖像中。
        gd.setColor(new Color(red, green, blue));
        gd.drawString(code, (i + 1) * xx, codeY);

        // 將產生的四個隨機數組合在一起。
        randomCode.append(code);
    }
    
    CaptchaCodeModel captchaCodeModel=new CaptchaCodeModel();
    captchaCodeModel.setCaptchaCode(randomCode.toString());
    captchaCodeModel.setCaptchaImage(buffImg);

    return captchaCodeModel;
}

public class CaptchaCodeModel{
    //驗證碼的String形式
    private String captchaCode;
    //驗證碼的圖片形式
    private BufferedImage captchaImage;

    public String getCaptchaCode() {
        return captchaCode;
    }

    public void setCaptchaCode(String captchaCode) {
        this.captchaCode = captchaCode;
    }

    public BufferedImage getCaptchaImage() {
        return captchaImage;
    }

    public void setCaptchaImage(BufferedImage captchaImage) {
        this.captchaImage = captchaImage;
    }
}

3.接收用戶傳過來的驗證碼並驗證:
/**
* 驗證驗證碼
*/
@RequestMapping(value = "valicatpcha")
public void register_R() {
PageData pageData = super.getPageData();

    // 獲取驗證碼
    String captchaCode = pageData.getString("captchacode");
    HttpServletRequest httpServletRequest = super.getRequest();
    Object codeObject = httpServletRequest.getSession().getAttribute(“captchacodekey”);
    // 驗證碼錯誤
    if (codeObject == null
            || Tools.isEmptyString(captchaCode)
            || !String.valueOf(codeObject).toUpperCase()
                    .equals(captchaCode.toUpperCase())) {
        setResult(
                MessageManager.getInstance().getMessage("invalidcaptcha"),
                ResultType.Error);
        return;
    }

}

頁面請求驗證碼並驗證的例子:

-請求驗證碼:<img src='captchacode' style='height:32px;width:148px;'
-驗證驗證碼:
function validcaptchacode(captchaCode) {
$.ajax({
type : "POST",
url : "valicatpcha",
data : {
captchacode : captchaCode,
tm : new Date().getTime()
},
dataType : "json",
cache : false,
success : function(data) {
alert(data);
},
error : function(data) {
alert(data); }
});
}



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

-Advertisement-
Play Games
更多相關文章
  • ZXing .NET 的項目主頁https://zxingnet.codeplex.com/ 代碼基本上抄襲自下麵兩篇文章 XDhttp://www.cnblogs.com/tianma3798/p/5426869.htmlhttp://www.cnblogs.com/tianma3798/p/54 ...
  • 20170210問題解析請點擊今日問題下方的“【Java每日一題】20170213”查看(問題解析在公眾號首發,公眾號ID:weknow619) 今日問題: 請問主程式輸出結果是什麼?(點擊以下“【Java每日一題】20170213”查看20170210問題解析) 題目原發佈於公眾號、簡書:【Jav ...
  • Java中的內部類 小記:內部類可以作為其他類的成員,而且可訪問它所在類的成員。 ...
  • 最近開始看Spring Boot,發現其開發起來真是方便。今天就來實現一個簡單的Spring MVC 請求,純Java代碼的哦。 1、Maven必不可少,先看看都載入了那些依賴: 2、Controller 3、頁面,放在src/main/resources/templates/目錄下,方便解析 4、 ...
  • 浮點數會有精度損失這個在上大學的時候就已經被告知,但是至今完全沒有想明白其中的原由,老師講的時候也是一筆帶過的,自己也沒有好好琢磨。終於在工作的時候碰到了,於是google了一番。 問題: 對兩個double類型的值進行運算,有時會出現結果值異常的問題。比如: 輸出: 39.989999999999 ...
  • 最近一直在搞郵件這塊,本來我們郵件發送是用的騰訊免費的企業郵箱,郵件功能沒有問題,但是由於郵件的限制,如下: 這些限制導致我們的部分客戶是收不到郵件的,哪怕付費,這樣的固定頻率限制也是無法解決的,可以說我們國內的郵件廠商都是這樣,而國外的卻要收費。 那麼問題來了,如何突破發送郵件的頻率限制? 1. ...
  • 當JSTL標簽庫已經無法滿足我們的需求時候,就需要自己開發自定義標簽,來滿足我們的需求,自定義標簽實際上是一個普通的java類,繼承SimpleTagSupport類。 做類。派生自SimpleTagSupport,重寫doTag()方法。getJspBody(),getJspContext(),i ...
  • 理解volatile 平時工作中對於多線程的應用並不太多,但是不能說工作中不應用就可以對此不去瞭解,至少要做的知道有這麼個東西,主要是作什麼的,這樣有助於看其它人寫的代碼。提到這個volatile,一般都會想到併發,同步,鎖之類,但要想搞清楚需要看看下麵一些知識。 處理器,高速緩存,主記憶體之間的關係 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...