Java動態(tài)驗證碼單線設(shè)計的兩種方法
1.java的動態(tài)驗證碼我這里將介紹兩種方法:
一:根據(jù)java本身提供的一種驗證碼的寫法,這種呢只限于大家了解就可以了,因為java自帶的模式編寫的在實際開發(fā)中是沒有意義的,所以只供學(xué)習(xí)一下就可以了,待會講解的第二種呢就是我們需要掌握的一種模式了:
第一種的代碼如下:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class inde
*/
@WebServlet("/inde")
public class inde extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public inde() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
/**動態(tài)生成圖片驗證碼
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//創(chuàng)建圖像
int width=100;
int height=40;
//圖片的大小設(shè)置
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//創(chuàng)建畫板
Graphics g=image.getGraphics();
setSquareBackGround(g,width,height,5);
//確定畫筆顏色
g.setColor(Color.black);
//填充矩形
g.fillRect(0, 0, width, height);
//在大矩形中放小矩形
g.setColor(Color.WHITE);
g.fillRect(1, 1, width-2, height-2);
//填充字符
String str = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789";
StringBuffer sb=new StringBuffer();
//畫隨機干擾框
setSquareBackGround(g,width,height,3);
//畫干擾點
CreateRandomPoint(width, height,100,g,100);
//隨機畫幾條線
CreateRandomLine(width, height,8,g,100);
//隨機獲取4個字符
Random random=new Random();
for (int i = 0; i < 4; i++) {
//62個填充字符里面隨機的隨機的收取字符
int index=random.nextInt(62);
//截取一個字符
String st=str.substring(index, index+1);
//把字符放到圖片中去
g.setColor(Color.red);
//設(shè)置字體
g.setFont(new Font("宋體",Font.BOLD,30));
g.drawString(st, 20*i, 30);//防止4個字符在一起
sb.append(st);
}
//把StringBuffer中的驗證碼放到session里面,目的是讓Login調(diào)用
HttpSession se=request.getSession();
se.setAttribute("number", sb.toString());
//發(fā)送圖片到瀏覽器 指定發(fā)送的圖片 和格式
response.setContentType("image/jpeg");
//圖片,圖片的格式,輸出的方式
ImageIO.write(image, "jpg", response.getOutputStream());
}
Random rand = new Random();
private void CreateRandomPoint(int width,int height,int many,Graphics g,int alpha)
{ // 隨機產(chǎn)生干擾點
for (int i=0;i<many;i++) {
int x = rand.nextInt(width);
int y = rand.nextInt(height);
g.setColor(getColor(alpha));
g.drawOval(x,y,rand.nextInt(3),rand.nextInt(3));
}
}
/**
* 隨機產(chǎn)生干擾線條
* @param width
* @param height
* @param minMany 最少產(chǎn)生的數(shù)量
* @param g
* @param alpha 透明度0~255 0表示全透
*/
private void CreateRandomLine(int width,int height,int minMany,Graphics g,int alpha)
{ // 隨機產(chǎn)生干擾線條
for (int i=0;i<getIntRandom(minMany, minMany+6);i++) {
int x1 =getIntRandom(0,(int)(width*0.6));
int y1 =getIntRandom(0,(int)(height*0.6));
int x2 =getIntRandom((int)(width*0.4),width);
int y2 =getIntRandom((int)(height*0.2),height);
g.setColor(getColor(alpha));
g.drawLine(x1, y1, x2, y2);
}
}
/**
* 由隨機產(chǎn)生的方塊來作為干擾背景
*/
private void setSquareBackGround(Graphics g,int width,int height,int count){
// 隨機產(chǎn)生干擾線條
for (int i=0;i<getIntRandom(count, count+2);i++) {
int x1 =getIntRandom(0,(int)(width*0.3));
int y1 =getIntRandom(0,(int)(height*0.3));
int x2 =getIntRandom((int)(width*0.5),width);
int y2 =getIntRandom((int)(height*0.55),height);
g.setColor(getColor(100));
int w=x2-x1;
int h=y2-y1;
if(w<0) w=-w;
if(h<0) h=-h;
g.drawRect(x1, y1, w, h);
g.setColor(getColor(25));
g.fillRect(x1, y1, w, h);
}
}
private int getIntRandom(double start,double end)
{ if(end<start)
{
double t=end;
end=start;
start=t;
}
double i=start+(int) (Math.random()*(end-start));
return (int)i;
}
上面的代碼呢寫的很詳細(xì)了,這里我就不重復(fù)了,這里的干擾線條是有很多寫法的,我這里就沒有全寫出來,有需要的話可以私聊我哦!
下面介紹第二種:
這種呢是我們開發(fā)中是可以用得到的,使用在的是網(wǎng)頁端的交互,我們在登錄網(wǎng)站的時候有很多的驗證碼就可以用這個來寫了
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class inde
*/
@WebServlet("/inde")
public class inde extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public inde() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
/**動態(tài)生成圖片驗證碼
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//創(chuàng)建圖像
int width=100;
int height=40;
//圖片的大小設(shè)置
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//創(chuàng)建畫板
Graphics g=image.getGraphics();
setSquareBackGround(g,width,height,5);
//確定畫筆顏色
g.setColor(Color.black);
//填充矩形
g.fillRect(0, 0, width, height);
//在大矩形中放小矩形
g.setColor(Color.WHITE);
g.fillRect(1, 1, width-2, height-2);
//填充字符
String str = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789";
StringBuffer sb=new StringBuffer();
//隨機獲取4個字符
Random random=new Random();
for (int i = 0; i < 4; i++) {
//62個填充字符里面隨機的隨機的收取字符
int index=random.nextInt(62);
//截取一個字符
String st=str.substring(index, index+1);
//把字符放到圖片中去
g.setColor(Color.red);
//設(shè)置字體
g.setFont(new Font("宋體",Font.BOLD,30));
g.drawString(st, 20*i, 30);//防止4個字符在一起
sb.append(st);
}
//把StringBuffer中的驗證碼放到session里面,目的是讓Login調(diào)用
HttpSession se=request.getSession();
se.setAttribute("number", sb.toString());
//發(fā)送圖片到瀏覽器 指定發(fā)送的圖片 和格式
response.setContentType("image/jpeg");
//圖片,圖片的格式,輸出的方式
ImageIO.write(image, "jpg", response.getOutputStream());
}
這樣就可以運行了,當(dāng)然了我們可以在這里面加入第一種的干擾模塊給拿過來這樣就可以實現(xiàn)整體的一個效果了。
總結(jié)
以上所述是小編給大家介紹的Java動態(tài)驗證碼單線設(shè)計的兩種方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
SpringBoot JdbcTemplate批量操作的示例代碼
本篇文章主要介紹了SpringBoot JdbcTemplate批量操作的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04
Java中new關(guān)鍵字和newInstance方法的區(qū)別分享
在初始化一個類,生成一個實例的時候,newInstance()方法和new關(guān)鍵字除了一個是方法一個是關(guān)鍵字外,最主要的區(qū)別是創(chuàng)建對象的方式不同2013-07-07
SpringBoot重啟后,第一次請求接口請求慢的問題及解決
這篇文章主要介紹了SpringBoot重啟后,第一次請求接口請求慢的問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
java.lang.OutOfMemoryError: Metaspace異常解決的方法
這篇文章主要介紹了java.lang.OutOfMemoryError: Metaspace異常解決的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
java 判斷一個數(shù)是否為2的整數(shù)次冪方法
今天小編就為大家分享一篇java 判斷一個數(shù)是否為2的整數(shù)次冪方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07

