Java動態(tài)驗(yàn)證碼單線設(shè)計(jì)的兩種方法
1.java的動態(tài)驗(yàn)證碼我這里將介紹兩種方法:
一:根據(jù)java本身提供的一種驗(yàn)證碼的寫法,這種呢只限于大家了解就可以了,因?yàn)閖ava自帶的模式編寫的在實(shí)際開發(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)生成圖片驗(yàn)證碼
* @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();
//畫隨機(jī)干擾框
setSquareBackGround(g,width,height,3);
//畫干擾點(diǎn)
CreateRandomPoint(width, height,100,g,100);
//隨機(jī)畫幾條線
CreateRandomLine(width, height,8,g,100);
//隨機(jī)獲取4個(gè)字符
Random random=new Random();
for (int i = 0; i < 4; i++) {
//62個(gè)填充字符里面隨機(jī)的隨機(jī)的收取字符
int index=random.nextInt(62);
//截取一個(gè)字符
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個(gè)字符在一起
sb.append(st);
}
//把StringBuffer中的驗(yàn)證碼放到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)
{ // 隨機(jī)產(chǎn)生干擾點(diǎ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));
}
}
/**
* 隨機(jī)產(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)
{ // 隨機(jī)產(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);
}
}
/**
* 由隨機(jī)產(chǎn)生的方塊來作為干擾背景
*/
private void setSquareBackGround(Graphics g,int width,int height,int count){
// 隨機(jī)產(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)站的時(shí)候有很多的驗(yàn)證碼就可以用這個(gè)來寫了
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)生成圖片驗(yàn)證碼
* @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();
//隨機(jī)獲取4個(gè)字符
Random random=new Random();
for (int i = 0; i < 4; i++) {
//62個(gè)填充字符里面隨機(jī)的隨機(jī)的收取字符
int index=random.nextInt(62);
//截取一個(gè)字符
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個(gè)字符在一起
sb.append(st);
}
//把StringBuffer中的驗(yàn)證碼放到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());
}
這樣就可以運(yùn)行了,當(dāng)然了我們可以在這里面加入第一種的干擾模塊給拿過來這樣就可以實(shí)現(xiàn)整體的一個(gè)效果了。
總結(jié)
以上所述是小編給大家介紹的Java動態(tài)驗(yàn)證碼單線設(shè)計(jì)的兩種方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- java實(shí)現(xiàn)動態(tài)驗(yàn)證碼
- java原生動態(tài)生成驗(yàn)證碼
- Java web實(shí)現(xiàn)動態(tài)圖片驗(yàn)證碼的示例代碼
- Java實(shí)現(xiàn)動態(tài)獲取圖片驗(yàn)證碼的示例代碼
- Java生成動態(tài)版驗(yàn)證碼的方法實(shí)例
- java Servlet 實(shí)現(xiàn)動態(tài)驗(yàn)證碼圖片示例
- java登錄驗(yàn)證碼實(shí)現(xiàn)代碼
- java 圖片驗(yàn)證碼的實(shí)現(xiàn)代碼
- Java實(shí)現(xiàn)驗(yàn)證碼具體代碼
- Java實(shí)現(xiàn)動態(tài)驗(yàn)證碼生成
相關(guān)文章
SpringBoot JdbcTemplate批量操作的示例代碼
本篇文章主要介紹了SpringBoot JdbcTemplate批量操作的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04
MyBatis-Plus?實(shí)體類注解的實(shí)現(xiàn)示例
MyBatis-Plus作為MyBatis的增強(qiáng)版,提供了一系列實(shí)用的注解,如@TableName、@TableId、@TableField等,旨在簡化數(shù)據(jù)庫和Java實(shí)體類之間的映射及CRUD操作,通過這些注解,開發(fā)者可以輕松實(shí)現(xiàn)表映射、字段映射、邏輯刪除、自動填充和樂觀鎖等功能2024-09-09
Java中new關(guān)鍵字和newInstance方法的區(qū)別分享
在初始化一個(gè)類,生成一個(gè)實(shí)例的時(shí)候,newInstance()方法和new關(guān)鍵字除了一個(gè)是方法一個(gè)是關(guān)鍵字外,最主要的區(qū)別是創(chuàng)建對象的方式不同2013-07-07
SpringBoot重啟后,第一次請求接口請求慢的問題及解決
這篇文章主要介紹了SpringBoot重啟后,第一次請求接口請求慢的問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
java.lang.OutOfMemoryError: Metaspace異常解決的方法
這篇文章主要介紹了java.lang.OutOfMemoryError: Metaspace異常解決的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Gradle相對于Maven有哪些優(yōu)點(diǎn)
這篇文章主要介紹了Gradle相對于Maven有哪些優(yōu)點(diǎn),幫助大家選擇合適的自動構(gòu)建工具,更好的構(gòu)建項(xiàng)目,感興趣的朋友可以了解下2020-10-10
java 判斷一個(gè)數(shù)是否為2的整數(shù)次冪方法
今天小編就為大家分享一篇java 判斷一個(gè)數(shù)是否為2的整數(shù)次冪方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07

