1. 程式人生 > >圖形驗證碼的生成-Google架構實現

圖形驗證碼的生成-Google架構實現

package utils;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import java.util.Random;

/**
 * 驗證碼生成器
 * Created by Administrator on 2018/3/28.
 * @author  
wt */ public class ImageCodeUtil { // 圖片的寬度。 private int width = 160; // 圖片的高度。 private int height = 40; // 驗證碼字元個數 private int codeCount = 5; // 驗證碼干擾線數 private int lineCount = 150; // 驗證碼 private String code = null; // 驗證碼圖片Buffer private BufferedImage buffImg = null; // 驗證碼範圍,去掉0(數字)和O(拼音)容易混淆的(小寫的1和L也可以去掉,大寫不用了)
private char[] codeSequence = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; /** * 預設建構函式,設定預設引數 */ public ImageCodeUtil() { this.createCode(); } /**
* @param width 圖片寬 * @param height 圖片高 */ public ImageCodeUtil(int width, int height) { this.width = width; this.height = height; this.createCode(); } /** * @param width 圖片寬 * @param height 圖片高 * @param codeCount 字元個數 * @param lineCount 干擾線條數 */ public ImageCodeUtil(int width, int height, int codeCount, int lineCount) { this.width = width; this.height = height; this.codeCount = codeCount; this.lineCount = lineCount; this.createCode(); } public void createCode() { int x = 0, fontHeight = 0, codeY = 0; int red = 0, green = 0, blue = 0; x = width / (codeCount + 2);//每個字元的寬度(左右各空出一個字元) fontHeight = height - 2;//字型的高度 codeY = height - 4; // 影象buffer buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = buffImg.createGraphics(); // 生成隨機數 Random random = new Random(); // 將影象填充為白色 g.setColor(Color.WHITE); g.fillRect(0, 0, width, height); // 建立字型,可以修改為其它的 Font font = new Font("Fixedsys", Font.PLAIN, fontHeight); // Font font = new Font("Times New Roman", Font.ROMAN_BASELINE, fontHeight); g.setFont(font); for (int i = 0; i < lineCount; i++) { // 設定隨機開始和結束座標 int xs = random.nextInt(width);//x座標開始 int ys = random.nextInt(height);//y座標開始 int xe = xs + random.nextInt(width / 8);//x座標結束 int ye = ys + random.nextInt(height / 8);//y座標結束 // 產生隨機的顏色值,讓輸出的每個干擾線的顏色值都將不同。 red = random.nextInt(255); green = random.nextInt(255); blue = random.nextInt(255); g.setColor(new Color(red, green, blue)); g.drawLine(xs, ys, xe, ye); } // randomCode記錄隨機產生的驗證碼 StringBuffer randomCode = new StringBuffer(); // 隨機產生codeCount個字元的驗證碼。 for (int i = 0; i < codeCount; i++) { String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]); // 產生隨機的顏色值,讓輸出的每個字元的顏色值都將不同。 red = random.nextInt(255); green = random.nextInt(255); blue = random.nextInt(255); g.setColor(new Color(red, green, blue)); g.drawString(strRand, (i + 1) * x, codeY); // 將產生的四個隨機數組合在一起。 randomCode.append(strRand); } // 將四位數字的驗證碼儲存到Session中。 code = randomCode.toString(); } public void write(String path) throws IOException { OutputStream sos = new FileOutputStream(path); this.write(sos); } public void write(OutputStream sos) throws IOException { ImageIO.write(buffImg, "jpg", sos); sos.close(); } public BufferedImage getBuffImg() { return buffImg; } public String getCode() { return code; } // /** // * 測試函式,預設生成到d盤 // * @param args // */ // public static void main(String[] args) { // ImageCodeUtil vCode = new ImageCodeUtil(160,40,5,150); // try { // String path="D:/"+new Date().getTime()+".png"; // System.out.println(vCode.getCode()+" >"+path); // vCode.write(path); // } catch (IOException e) { // e.printStackTrace(); // } // }

}

=====

@Override
public JSONObject getVerifyCodes(String ranCode) {
        JSONObject object = new JSONObject();
        ImageCodeUtil vCode = new ImageCodeUtil(160,40,5,150);
        ByteArrayOutputStream bas = new ByteArrayOutputStream();
        try {
            vCode.write(bas);
        } catch (IOException e) {
            e.printStackTrace();
        }
        String oldCode = vCode.getCode();
//        RedisModule redis = new RedisModule();
//        Jedis jedis = redis.getJedis();
//        jedis.set("code"+ranCode,oldCode);
object.put("image",bas.toByteArray());
        return object;
    }
=======
Map<String,String> map =this.formFactory.form().bindFromRequest().data();
String ranCode = map.get("ranCode"); //redis 的key
JSONObject json = this.userService.getVerifyCodes(ranCode);
return ok(json.getBytes("image")).as("image/jpg") ; //返回圖形IO流

相關推薦

圖形驗證生成-Google架構實現

package utils; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.FileOutputStream; impo

java圖形驗證生成工具類及web頁面校驗驗證

組合 line des resp word buffere 需要 case ali 最近做驗證碼,參考網上案例,發現有不少問題,特意進行了修改和完善。驗證碼生成器:[ht

圖形驗證的兩種實現方式

ava 輸入 urn color deb rect lac prev 後臺 情形一:圖形驗證碼跟短信驗證碼一起,只需要將後臺提供的動態鏈接填到(id="img")的src中即可生成動態驗證碼。 然後,在需要請求接口的地方,只需把(id="imgCode")中用戶輸入的信息通

密碼錯誤次數管理和圖形驗證管理介面和實現

在開發中,登入介面一般會校驗密碼,當密碼錯誤次數達到一定次數(閥值)就啟用圖形驗證碼校驗,此舉的目的主要是為了防止暴力破解密碼。基於此,我抽取了密碼次數管理介面和驗證碼校驗。 錯誤次數管理器: import cn.palmte.anfang.model.Member;

c# 圖形驗證生成 程式碼解析

之前做登入時,傳送簡訊驗證碼需要做安全控制,使用到了圖形驗證碼 使用的思路是: 1、建立一個驗證碼圖片生成器頁面 2、生成字母或數字組成的隨機字串 3、在Cookie中儲存隨機驗證碼 4、根據生成的隨機驗證碼,生成驗證碼圖片 5、前端呼叫該頁面,填寫

簡單版:帶干擾線的圖形驗證生成

maven/java/web/bootstrapQQ群:566862629。希望更多人一起幫助我學習。 1.生成工具類; import java.awt.Color; import java.a

Tornado框架實現圖形驗證功能

tor length turn 黑客 body world 工作流 params fun 圖形驗證碼是項目開發過程中經常遇到的一個功能,在很多語言中都有對應的不同形式的圖形驗證碼功能的封裝,python 中同樣也有類似的封裝操作,通過繪制生成一個指定的圖形數據,讓前端HTM

Net Core 生成圖形驗證

max 輸出 from sys 驗證碼 format bitmap reg length 1. NetCore ZKweb 在我第一次繪制圖形驗證碼時是采用的ZKweb的繪制庫,奉上代碼參考 1 public byte[] GetVerifyC

php實現圖形驗證詳解!

最近由於專案需要,圖形驗證碼,就寫了一個,為大家詳細介紹下實現過程! 1、驗證碼封裝實現方法 //生成驗證碼 public function get_img_code(){ ob_clean(); cookie('code',NULL); session('code',NU

python 生成圖形驗證

draw 圖像處理 圖形驗證碼 字母 ice 前端 rgb 打開 clas 文章鏈接:https://mp.weixin.qq.com/s/LYUBRNallHcjnhJb1R3ZBg 日常在網站使用過程中經常遇到圖形驗證,今天準備自己做個圖形驗證碼,這算是個簡單的功能

Python實現自動登入,強行突破圖形驗證

  驗證碼有圖形驗證碼、極驗滑動驗證碼、點觸驗證碼、宮格驗證碼。這回重點講講圖形驗證碼的識別。 學習Python中有不明白推薦加入交流群                 號:516107834 &

利用Python識別圖形驗證實現自動登入!室友驚訝的合不攏嘴!

驗證碼有圖形驗證碼、極驗滑動驗證碼、點觸驗證碼、宮格驗證碼。這回重點講講圖形驗證碼的識別。 雖說圖形驗證碼最簡單,但是對於我這等新手,還是要苦學一番。首先尋找測試網站,網站選的是如雲閣小說網,小網站不怕被封。他們的驗證碼一般如下:      

time-based基於google key生成6位驗證google authenticator)

input div 如果 multipl turn 啟用 struct highlight time 由於公司服務器啟用了雙因子認證,登錄時需要再次輸入谷歌身份驗證器生成的驗證碼。而生成驗證碼是基於一套固定的算法的,以當前時間為基礎,基於每個人的google key去生成一

Java實現圖形驗證

一、功能分析 在登入頁面實現圖形驗證碼的功能 具體實現:(思路分析) 1、登入頁面中通過img標籤呼叫封裝的工具類VerifyUtil(說明登入頁面用jsp實現,為了後期接收響應結果) 2、編寫工具類VerifyUtil,具體功能: 生成四個隨機

實現簡單圖形驗證功能

HTML <img src="" class="VerifiImg" /> <input type="hidden" id="randomNum" /> JavaScript // 隨機數 function getRanNum()

Spring Security、實現圖形驗證功能、實現"記住我"功能

說在前面 博主最近會有很多專案跟大家一起分享,做完後會上傳github上的,希望讀友們能給博主提提意見哈哈 這個專案是第三方登入和安全方面的,關於後臺與a

使用Servlet實現圖形驗證登入頁面

1.介紹 首先需要寫一個生成圖形驗證碼的Servlet: 我這裡的Servlet為:createImageServlet 然後我們使用登入頁面來驗證是否能獲取圖形驗證碼。 登入後通過Servlet判斷使用者名稱密碼是否為張三和123(這裡簡單操作就不連線資料庫了) 登入頁面

圖形驗證實現(java)

前言 圖形驗證碼在我們日常生活中是很常見的,一般用於登入頁面來避免簡單的網路機器人來不斷地請求你的資料。以前總是覺得這個很神奇,總以為是先自己做好一張張的靜態圖片然後切換即可。當時也存在個疑問,如果是這樣,那豈不是會重複?知道後來看到同事寫的程式碼才知道具體的實現過程。 實現過程 做法簡述

Python識別圖形驗證實現自動登陸(附視訊教程)

驗證碼有圖形驗證碼、極驗滑動驗證碼、點觸驗證碼、宮格驗證碼。這回重點講講圖形驗證碼的識別。 雖說圖形驗證碼最簡單,但是對於我這等新手,還是要苦學一番。首先尋找測試網站,網站選的是如雲閣小說網,小網站不怕被封。他們的驗證碼一般如下:視訊教程:     &n

spring mvc 整合 jcaptcha 生成圖形驗證

jcaptcha是一個開源的用來生成驗證碼的Java開源元件 maven依賴 <dependency> <groupId>com.octo.captcha