java識別驗證碼,java實現驗證碼校驗

本文目錄一覽:

北大青鳥java培訓:解決WEB性能測試中的驗證碼問題?

現在越來越多的網站為了安全性或是防止Spam的侵害,採用了驗證碼的校驗技術。

簡單地說,驗證碼就是在進行登錄或是內容提交的時候,頁面上會隨機出現一個人工可識別,但機器不可識別的驗證字符串(一般是採用背景、扭曲等方式產生的圖片),要求登錄或是提交內容時同時輸入這個驗證碼。

驗證碼可以有效防止對口令的刺探和所謂的網絡推廣軟件帶來的大量的Spam內容,目前已經被許多Internet或是Intranet應用接受為標準的實現方式。

但對性能測試來說,這種驗證碼又帶來了很大的問題。

最突出的問題是,性能測試工具本身是自動化工具,由於這種驗證碼採用的是“防止自動化工具嘗試”的方法,因此,在錄製了腳本之後會發現,很難對腳本進行調整,以使其適應驗證碼驗證的需要。

已經不止一次有人提到這個問題,並詢問有沒有較好的解決方案。

對這個問題,我個人的看法是,基本上可以考慮從三個途徑來解決該問題:1、第一種方法,也是最容易想到的,在被測系統中暫時屏蔽驗證功能,也就是說,臨時修改應用,無論用戶輸入的是什麼驗證碼,都認為是正確的。

這種方法最容易實現,對測試結果也不會有太大的影響(當然,這種方式去掉了“驗證驗證碼”這個環節,不過這個環節本來就很難成為系統性能瓶頸)。

但這種方法有一個致命的問題:如果被測系統是一個實際已上線的系統,屏蔽驗證功能會對已經在運行的業務造成非常大的安全性的風險,因此,對於已上線的系統來說,用這種方式就不合適了;2、第二種方法,在第一種方法的基礎上稍微進行一些改進。

第一種方法帶來了很大的安全性問題,那麼我們可以考慮,不取消驗證,但在其中留一個後門,我們設定一個所謂的“萬能驗證碼”,只要用戶輸入這個“萬能驗證碼”,我們就驗證通過,否則,還是按照原先的驗證方式進行驗證。

這種方式仍然存在安全性的問題,但由於我們可以通過管理手段將“萬能驗證碼”控制在一個小的範圍內,而且只在性能測試期間保留這個小小的後門,相對第一種方法來說,在安全性方面已經有較大的改進了;3、如果安全性對應用來說真的是至關重要的,不容許有一絲一毫的閃失,那我們還可以用更進一步的方法來處理這個問題。

一般的性能測試工具(MI的LR、Seague的Silkperformer等)都能夠調用外部的DLL或是組件接口,因此,廣西電腦培訓建議可以考慮獲得“驗證碼驗證”部分的實現,寫一個驗證碼獲取的DLL,在測試腳本中進行調用即可。

JSP實例:Java實現隨機驗證碼功能實例

現在許多系統的註冊 登錄或者發布信息模塊都添加的隨機碼功能 就是為了避免自動註冊程序或者自動發布程序的使用

驗證碼實際上就是隨機選擇一些字符以圖片的形式展現在頁面上 如果進行提交操作的同時需要將圖片上的字符同時提交 如果提交的字符與服務器session保存的不同 則認為提交信息無效 為了避免自動程序分析解析圖片 通常會在圖片上隨機生成一些干擾線或者將字符進行扭曲 增加自動識別的難度

在這裡 我們使用servlet來實現隨機驗證碼的實現

package servlet; import java awt Color; import java awt Font; import java awt Graphics D; import java awt image BufferedImage; import java util Random; import javax imageio ImageIO; import javax servlet ServletException; import javax servlet ServletOutputStream; import javax servlet import javax servlet import javax servlet import javax servlet /** * 生成隨機驗證碼 * @author bitiliu * */ public class ValidateCodeServlet extends HttpServlet { private static final long serialVersionUID = L; //驗證碼圖片的寬度 private int width= ; //驗證碼圖片的高度 private int height= ; //驗證碼字符個數 private int codeCount= ; private int x= ; //字體高度 private int fontHeight; private int codeY; 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 }; /** * 初始化驗證圖片屬性 */ public void init() throws ServletException { //從web xml中獲取初始信息 //寬度 String strWidth=this getInitParameter(“width”); //高度 String strHeight=this getInitParameter(“height”); //字符個數 String strCodeCount=this getInitParameter(“codeCount”); //將配置的信息轉換成數值 try { if(strWidth!=null strWidth length()!= ) { width=Integer parseInt(strWidth); } if(strHeight!=null strHeight length()!= ) { height=Integer parseInt(strHeight); } if(strCodeCount!=null strCodeCount length()!= ) { codeCount=Integer parseInt(strCodeCount); } } catch(NumberFormatException e) {} x=width/(codeCount+ ); fontHeight=height ; codeY=height ; } protected void service(HttpServletRequest req HttpServletResponse resp) throws ServletException java io IOException { //定義圖像buffer BufferedImage buffImg = new BufferedImage( width height BufferedImage TYPE_INT_RGB); Graphics D g = buffImg createGraphics(); //創建一個隨機數生成器類 Random random = new Random(); //將圖像填充為白色 g setColor(Color WHITE); g fillRect( width height); //創建字體 字體的大小應該根據圖片的高度來定 Font font = new Font(“Fixedsys” Font PLAIN fontHeight); //設置字體 g setFont(font); //畫邊框 g setColor(Color BLACK); g drawRect( width height ); //隨機產生 條幹擾線 使圖象中的認證碼不易被其它程序探測到 g setColor(Color BLACK); for(int i = ; i ; i++) { int x = random nextInt(width); int y = random nextInt(height); int xl = random nextInt( ); int yl = random nextInt( ); g drawLine(x y x + xl y + yl); } //randomCode用於保存隨機產生的驗證碼 以便用戶登錄後進行驗證 StringBuffer randomCode = new StringBuffer(); int red = green = blue = ; //隨機產生codeCount數字的驗證碼 for (int i = ; i codeCount; i++) { //得到隨機產生的驗證碼數字 String strRand = String valueOf(codeSequence[random nextInt( )]); //產生隨機的顏色分量來構造顏色值 這樣輸出的每位數字的顏色值都將不同 red = random nextInt( ); green = random nextInt( ); blue = random nextInt( ); //用隨機產生的顏色將驗證碼繪製到圖像中 g setColor(new Color(red green blue)); g drawString(strRand (i + ) * x codeY); //將產生的四個隨機數組合在一起 randomCode append(strRand); } // 將四位數字的驗證碼保存到Session中 HttpSession session = req getSession(); session setAttribute(“validateCode” randomCode toString()); // 禁止圖像緩存 resp setHeader(“Pragma” “no cache”); resp setHeader(“Cache Control” “no cache”); resp setDateHeader(“Expires” ); resp setContentType(“image/jpeg”); //將圖像輸出到Servlet輸出流中 ServletOutputStream sos = resp getOutputStream(); ImageIO write(buffImg “jpeg” sos); sos close(); } }

需要在web xml中聲明servlet

servlet servlet nameValidateCodeServlet/servlet name servlet class servlet ValidateCodeServlet/servlet class init param param namewidth/param name param value /param value /init param init param param nameheight/param name param value /param value /init param init param param namecodeCount/param name param value /param value /init param /servlet servlet mapping servlet nameValidateCodeServlet/servlet name url pattern/validateCodeServlet/url pattern /servlet mapping

需要引用的頁面可以這樣來寫

ccid_file values=”validateCodeServlet” width= / /

lishixinzhi/Article/program/Java/JSP/201311/19913

JAVA識別圖片驗證碼

package com.he;

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import java.util.*;

import java.awt.*;

import java.awt.image.*;

import javax.imageio.*;

public class CodeFact

extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws

ServletException, IOException {

//設置頁面不緩存

response.setHeader(“Pragma”, “No-cache”);

response.setHeader(“Cache-Control”, “no-cache”);

response.setDateHeader(“Expires”, 0);

// 在內存中創建圖象

int width = 60, height = 20;

BufferedImage image = new BufferedImage(width, height,

BufferedImage.TYPE_INT_RGB);

// 獲取圖形上下文

Graphics g = image.getGraphics();

//生成隨機類

Random random = new Random();

// 設定背景色

g.setColor(getRandColor(200, 250));

g.fillRect(0, 0, width, height);

//設定字體

g.setFont(new Font(“Times New Roman”, Font.PLAIN, 18));

//畫邊框

g.setColor(new Color(33,66,99));

g.drawRect(0,0,width-1,height-1);

// 隨機產生155條幹擾線,使圖象中的認證碼不易被其它程序探測到

g.setColor(getRandColor(160, 200));

for (int i = 0; i 155; i++) {

int x = random.nextInt(width);

int y = random.nextInt(height);

int xl = random.nextInt(12);

int yl = random.nextInt(12);

g.drawLine(x, y, x + xl, y + yl);

}

// 取隨機產生的認證碼(4位數字)

String sRand = “”;

for (int i = 0; i 4; i++) {

String rand = String.valueOf(random.nextInt(10));

sRand += rand;

// 將認證碼顯示到圖象中

g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110),

20 + random.nextInt(110))); //調用函數出來的顏色相同,可能是因為種子太接近,所以只能直接生成

g.drawString(rand, 13 * i + 6, 16);

}

// 將認證碼存入SESSION

HttpSession session = request.getSession();

session.setAttribute(“rand”, sRand);

// 圖象生效

g.dispose();

// 輸出圖象到頁面

ImageIO.write(image, “JPEG”, response.getOutputStream());

}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws

ServletException, IOException {

doGet(request, response);

}

//給定範圍獲得隨機顏色

private Color getRandColor(int fc, int bc) {

Random random = new Random();

if (fc 255) {

fc = 255;

}

if (bc 255) {

bc = 255;

}

int r = fc + random.nextInt(bc – fc);

int g = fc + random.nextInt(bc – fc);

int b = fc + random.nextInt(bc – fc);

return new Color(r, g, b);

}

}

你試試!!

java實現驗證碼的自動識別

方式比較多,用一個二維數組存放,如a[5][5]={{0.jpg,1.jpg,2.jpg,3.jpg,4.jpg},{“1212″,”1233″,”2323″,”23255″,”23554”}},可以動態的生成一個小於5的數字,直接把生成的數字和下標對應,在和後面的的字符串比較就可以自動驗證了

java怎麼實現驗證碼識別?

圖片驗證碼是什麼

圖片驗證碼,這個大家應該都見過。最普遍的圖片驗證碼就是一張圖片上面有4-6個歪歪扭扭的數字字母,圖片還有點看不清楚,但是基本可以肉眼識別出上面的數字字母。那為什麼要有這個東東呢?

其實驗證碼的出現為了區分人與機器。對於歪歪妞妞還有點看不清的數字字母圖片,由於人腦的特殊構造,是可以完全無障礙識別的,但是想讓奇蹟識別出這些字母數字,就會出現識別錯誤。那為什麼要區別人與機器呢?假如一個一個系統沒有驗證碼,我知道了你的用戶名,並且知道你的登錄密碼是8位的數字,那我完全可以寫個腳本程序窮舉出所有的8位數組合,挨個去嘗試登錄,這個過程對於人來說可能耗時耗力,但是對於程序來說,so easy。所以驗證碼的出現就會阻止程序進行這樣的窮舉登錄。

隨着技術的發展,現在很多的驗證碼系統都可以通過圖像處理、機器學習深度學習等方式進行攻破,圖片驗證碼已經不再安全,即使是非常有名的12306驗證碼,也已經被利用深度學習達到了很高的識別精度。所以也出現了手機驗證碼、拖動滑塊圖片到指定位置的驗證碼等各種驗證碼。

java短信驗證碼如何驗證

先創建一個驗證碼,通過短信代理髮送到用戶指定的手機,待用戶提交後做對比,看驗證碼是否一致。

整體流程:

用戶輸入手機號碼,點擊獲取驗證碼

服務器創建驗證碼,並通過短信代理商發送到用戶手機

用戶查看驗證碼,輸入提交

服務器進行確認,反饋成功或者失敗。

原創文章,作者:RPZD,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/148509.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
RPZD的頭像RPZD
上一篇 2024-11-03 15:16
下一篇 2024-11-03 15:16

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論