本文目錄一覽:
- 1、北大青鳥java培訓:解決WEB性能測試中的驗證碼問題?
- 2、JSP實例:Java實現隨機驗證碼功能實例
- 3、JAVA識別圖片驗證碼
- 4、java實現驗證碼的自動識別
- 5、java怎麼實現驗證碼識別?
- 6、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-tw/n/148509.html