java驗證碼圖片
『壹』 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 name>ValidateCodeServlet</servlet name> <servlet class> servlet ValidateCodeServlet</servlet class> <init param> <param name>width</param name> <param value> </param value> </init param> <init param> <param name>height</param name> <param value> </param value> </init param> <init param> <param name>codeCount</param name> <param value> </param value> </init param> </servlet> <servlet mapping> <servlet name>ValidateCodeServlet</servlet name> <url pattern>/validateCodeServlet</url pattern> </servlet mapping>
需要引用的頁面可以這樣來寫
<ccid_file values="validateCodeServlet" width= / />
lishixin/Article/program/Java/JSP/201311/19913
『貳』 Java如何實現驗證碼驗證功能
package util; import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.Random;import javax.imageio.ImageIO; public final class ImageUtil { // 驗證碼字元集 private static final char[] chars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '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', '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'}; // 字元數量 private static final int SIZE = 4; // 干擾線數量 private static final int LINES = 5; // 寬度 private static final int WIDTH = 80; // 高度 private static final int HEIGHT = 40; // 字體大小 private static final int FONT_SIZE = 30; /** * 生成隨機驗證碼及圖片 * 返回的數組中,第1個值是驗證碼,第2個值是圖片 */ public static Object[] createImage() { StringBuffer sb = new StringBuffer(); // 1.創建空白圖片 BufferedImage image = new BufferedImage( WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); // 2.獲取圖片畫筆 Graphics graphic = image.getGraphics(); // 3.設置畫筆顏色 graphic.setColor(Color.LIGHT_GRAY); // 4.繪制矩形背景 graphic.fillRect(0, 0, WIDTH, HEIGHT); // 5.畫隨機字元 Random ran = new Random(); for (int i = 0; i <SIZE; i++) { // 取隨機字元索引 int n = ran.nextInt(chars.length); // 設置隨機顏色 graphic.setColor(getRandomColor()); // 設置字體大小 graphic.setFont(new Font( null, Font.BOLD + Font.ITALIC, FONT_SIZE)); // 畫字元 graphic.drawString( chars[n] + "", i * WIDTH / SIZE, HEIGHT / 2); // 記錄字元 sb.append(chars[n]); } // 6.畫干擾線 for (int i = 0; i < LINES; i++) { // 設置隨機顏色 graphic.setColor(getRandomColor()); // 隨機畫線 graphic.drawLine(ran.nextInt(WIDTH), ran.nextInt(HEIGHT), ran.nextInt(WIDTH), ran.nextInt(HEIGHT)); } // 7.返回驗證碼和圖片 return new Object[]{sb.toString(), image}; } /** * 隨機取色 */ public static Color getRandomColor() { Random ran = new Random(); Color color = new Color(ran.nextInt(256), ran.nextInt(256), ran.nextInt(256)); return color; } public static void main(String[] args) throws IOException { Object[] objs = createImage(); BufferedImage image = (BufferedImage) objs[1]; OutputStream os = new FileOutputStream("d:/1.png"); ImageIO.write(image, "jpeg", os); os.close(); } }
『叄』 java 登陸時的驗證碼怎麼做
後台寫一個生成圖片隨機的代碼,生成圖片給前台。切換圖片的時候,使用ajax獲取圖片數據就行。
附上生成圖片的代碼
public class ValidateCode {
private int width=180;
private int height=60;
private int codeCount = 4;
private int x = 0;
private int codeY;
private String Code;
private BufferedImage buffImg;
static 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','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', 'o', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
private int fontHeight;
public ValidateCode() {
x = width / (codeCount + 2);
fontHeight = height - 2;
codeY = height - 4;
CreateCode();
}
public void CreateCode(){
// 定義圖像buffer
BufferedImage 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);
// 設置字體。
g.setFont(font);
// 畫邊框。
g.setColor(Color.BLACK);
g.drawRect(0, 0, width - 1, height - 1);
// randomCode用於保存隨機產生的驗證碼,以便用戶登錄後進行驗證。
StringBuffer randomCode = new StringBuffer();
int red = 0, green = 0, blue = 0;
// 隨機產生codeCount數字的驗證碼。
for (int i = 0; i < codeCount; i++) {
// 得到隨機產生的驗證碼數字。
String strRand = String.valueOf(codeSequence[random.nextInt(62)]);
// 產生隨機的顏色分量來構造顏色值,這樣輸出的每位數字的顏色值都將不同。
red = random.nextInt(255);
green = random.nextInt(255);
blue = random.nextInt(255);
// 用隨機產生的顏色將驗證碼繪制到圖像中。
g.setColor(new Color(red, green, blue));
g.drawString(strRand, (i ) * x+20, codeY);
// 將產生的四個隨機數組合在一起。
randomCode.append(strRand);
}
this.Code=randomCode.toString().toUpperCase();
this.buffImg=buffImg;
}
public String getCode() {
return Code;
}
public void setCode(String code) {
Code = code;
}
public BufferedImage getBuffImg() {
return buffImg;
}
public void setBuffImg(BufferedImage buffImg) {
this.buffImg = buffImg;
}
}
『肆』 java怎麼生成驗證碼圖片
原理,在servlet中隨機生成一個4位數字1000-9999
然後把這數字寫入session
輸出一個圖片,上面寫有這四個數字
在伺服器端根據用戶輸入的數字和
session中的值比較。
注意比較結束後要清空session中的值
有很多人問到驗證碼的作用。
我作個簡單的解釋。
驗證碼的作用:有效防止這種問題對某一個特定注冊用戶用特定程序暴力破解方式進行不斷的登陸嘗試,實際上是用驗證碼是現在很多網站通行的方式(比如招商銀行的網上個人銀行,騰訊的QQ社區),我們利用比較簡易的方式實現了這個功能。雖然登陸麻煩一點,但是對社區還來說這個功能還是很有必要,也很重要。但我們還是提醒大家主要保護自己的密碼,盡量使用混雜了數字、字母、符號在內的6位以上密碼,不要使用諸如1234之類的簡單密碼或者與用戶名相同、類似的密碼。
還有就是注冊時發表文章時加驗證碼,就防人用注冊機,無限的自動注冊,
package com.schoolwx.util;
import java.io.*;
import java.util.*;
import com.sun.image.codec.jpeg.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.*;
public class getImg extends HttpServlet {
private Font mFont=new Font("宋體", Font.PLAIN,12);//設置字體
//處理post
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
doGet(request,response);
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
//取得一個1000-9999的隨機數
String s="";
int intCount=0;
intCount=(new Random()).nextInt(9999);//
if(intCount<1000)intCount+=1000;
s=intCount+"";
//對session付值。
HttpSession session=request.getSession (true);
session.setAttribute("getImg",s);
response.setContentType("image/gif");
ServletOutputStream out=response.getOutputStream();
BufferedImage image=new BufferedImage(35,14,BufferedImage.TYPE_INT_RGB);
Graphics gra=image.getGraphics();
//設置背景色
gra.setColor(Color.yellow);
gra.fillRect(1,1,33,12);
//設置字體色
gra.setColor(Color.black);
gra.setFont(mFont);
//輸出數字
char c;
for(int i=0;i<4;i++) {
c=s.charAt(i);
gra.drawString(c+"",i*7+4,11); //7為寬度,11為上下高度位置
}
JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
}
}
『伍』 java怎麼顯示網頁驗證碼圖片
這個的話,要涉及到jsp、servlet、網頁,後台的請求了。我這里寫一個給你看看吧。
https://github.com/chinameepo/com_dengc_grate_struts_learn/tree/master/Myfirst,這個是我的github倉庫,裡面剛好就有個一個我自己寫的輸出驗證碼的。
使用ide:myeclipse
jdk:1.6.0
伺服器:tomcat
『陸』 用java程序如何解析驗證碼圖片
驗證碼解析???驗證碼一般是在後台生成,然後保存在session里,再返回前台上顯示,驗證時輸入數字後調用session的屬性就可以判斷了
『柒』 java怎麼實現驗證碼識別
圖片驗證碼是什麼
圖片驗證碼,這個大家應該都見過。最普遍的圖片驗證碼就是一張圖片上面有4-6個歪歪扭扭的數字字母,圖片還有點看不清楚,但是基本可以肉眼識別出上面的數字字母。那為什麼要有這個東東呢?
其實驗證碼的出現為了區分人與機器。對於歪歪妞妞還有點看不清的數字字母圖片,由於人腦的特殊構造,是可以完全無障礙識別的,但是想讓奇跡識別出這些字母數字,就會出現識別錯誤。那為什麼要區別人與機器呢?假如一個一個系統沒有驗證碼,我知道了你的用戶名,並且知道你的登錄密碼是8位的數字,那我完全可以寫個腳本程序窮舉出所有的8位數組合,挨個去嘗試登錄,這個過程對於人來說可能耗時耗力,但是對於程序來說,so easy。所以驗證碼的出現就會阻止程序進行這樣的窮舉登錄。
隨著技術的發展,現在很多的驗證碼系統都可以通過圖像處理、機器學習深度學習等方式進行攻破,圖片驗證碼已經不再安全,即使是非常有名的12306驗證碼,也已經被利用深度學習達到了很高的識別精度。所以也出現了手機驗證碼、拖動滑塊圖片到指定位置的驗證碼等各種驗證碼。