java后臺驗證碼生成的實現(xiàn)方法
效果圖如下:

1.適用需求
后臺生成驗證碼,用于登陸驗證。
2. 功能實現(xiàn)所需控件/文件:
無(普通標(biāo)簽)
3.功能點實現(xiàn)思路
1)前臺思路:
(1)前臺一個<input>用于輸入驗證碼;一個<img>用于展示驗證碼。
(2)驗證碼生成以及展示,點擊刷新功能,可以為<img>綁定click事件。
(3)click事件里面寫ajax請求,通過后臺生成處理好的帶噪點的驗證碼圖片。
注意:后臺直接返回圖片,不是驗證碼的字符!若返回字符,則驗證碼就失去了意義(前臺很容易就可以獲取驗證碼字符,進(jìn)行多次惡意訪問了)(這點考慮了系統(tǒng)安全性)
(4)關(guān)于返回的圖片如何在<img>標(biāo)簽內(nèi)展示
直接利用img的src屬性,屬性值為后臺生成驗證碼的方法請求路徑即可。當(dāng)點擊驗證碼的時候,再動態(tài)設(shè)置src屬性即可(原訪問地址+隨機(jī)時間戳,防止同一路徑瀏覽器不另作訪問的問題)
前臺部分代碼:
/*驗證碼輸入框*/
<input class="verifyInput" name="verifyInput" placeholder="請輸入驗證碼">
/*驗證碼圖片*/
<img class="verifyCode" onclick="changeCode()" src="getVerifyCode">
//src的getVerifyCode是后臺訪問地址;項目為SSM框架。
/*點擊刷新驗證碼*/
function changeCode(){
var src = " getVerifyCode?"+new Date().getTime(); //加時間戳,防止瀏覽器利用緩存
$('.verifyCode').attr("src",src); //jQuery寫法
}
2)后臺思路:
后臺思路很簡單,利用BufferedImage類創(chuàng)建一張圖片,再用Graphics2D對圖片進(jìn)行繪制(生成隨機(jī)字符,添加噪點,干擾線)即可。注意生成的驗證碼字符串要放到session中,用于接下來登陸的驗證碼驗證(當(dāng)然也是后臺)。
部分代碼如下:
/* 獲取驗證碼圖片*/
@RequestMapping("/getVerifyCode ")
public void getVerificationCode(HttpServletResponse response,HttpServletRequest request) {
try {
int width=200;
int height=69;
BufferedImage verifyImg=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//生成對應(yīng)寬高的初始圖片
String randomText = VerifyCode.drawRandomText(width,height,verifyImg);
//單獨的一個類方法,出于代碼復(fù)用考慮,進(jìn)行了封裝。
//功能是生成驗證碼字符并加上噪點,干擾線,返回值為驗證碼字符
request.getSession().setAttribute("verifyCode", randomText);
response.setContentType("image/png");//必須設(shè)置響應(yīng)內(nèi)容類型為圖片,否則前臺不識別
OutputStream os = response.getOutputStream(); //獲取文件輸出流
ImageIO.write(verifyImg,"png",os);//輸出圖片流
os.flush();
os.close();//關(guān)閉流
} catch (IOException e) {
this.logger.error(e.getMessage());
e.printStackTrace();
}
}
/*對圖片進(jìn)行處理的類和方法*/
public class VerifyCode {
public static String drawRandomText(int width,int height,BufferedImage verifyImg) {
Graphics2D graphics = (Graphics2D)verifyImg.getGraphics();
graphics.setColor(Color.WHITE);//設(shè)置畫筆顏色-驗證碼背景色
graphics.fillRect(0, 0, width, height);//填充背景
graphics.setFont(new Font("微軟雅黑", Font.BOLD, 40));
//數(shù)字和字母的組合
String baseNumLetter= = "123456789abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";
StringBuffer sBuffer = new StringBuffer();
int x = 10; //旋轉(zhuǎn)原點的 x 坐標(biāo)
String ch = "";
Random random = new Random();
for(int i = 0;i < 4;i++){
graphics.setColor(getRandomColor());
//設(shè)置字體旋轉(zhuǎn)角度
int degree = random.nextInt() % 30; //角度小于30度
int dot = random.nextInt(baseNumLetter.length());
ch = baseNumLetter.charAt(dot) + "";
sBuffer.append(ch);
//正向旋轉(zhuǎn)
graphics.rotate(degree * Math.PI / 180, x, 45);
graphics.drawString(ch, x, 45);
//反向旋轉(zhuǎn)
graphics.rotate(-degree * Math.PI / 180, x, 45);
x += 48;
}
//畫干擾線
for (int i = 0; i <6; i++) {
// 設(shè)置隨機(jī)顏色
graphics.setColor(getRandomColor());
// 隨機(jī)畫線
graphics.drawLine(random.nextInt(width), random.nextInt(height),
random.nextInt(width), random.nextInt(height));
}
//添加噪點
for(int i=0;i<30;i++){
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
graphics.setColor(getRandomColor());
graphics.fillRect(x1, y1, 2,2);
}
return sBuffer.toString();
}
/**
* 隨機(jī)取色
*/
private static Color getRandomColor() {
Random ran = new Random();
Color color = new Color(ran.nextInt(256),
ran.nextInt(256), ran.nextInt(256));
return color;
}
}
4.功能實現(xiàn)心得:
驗證碼的功能實現(xiàn)思路很簡單,從系統(tǒng)安全性和代碼復(fù)用性這兩點考慮,驗證碼必須后臺生成,生成驗證碼的方法可以封裝到靜態(tài)工具類里。此外,后臺用到許多Java自帶的圖片處理類值得學(xué)習(xí)。
到此這篇關(guān)于java后臺驗證碼生成的實現(xiàn)方法的文章就介紹到這了,更多相關(guān)java 驗證碼生成內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot3整合knife4j詳細(xì)圖文教程(swagger增強(qiáng))
開發(fā)api提供對應(yīng)的接口規(guī)范進(jìn)行聯(lián)調(diào)或并行開發(fā),api文檔管理必不可少,常用的Knife4j基于swagger(依賴已經(jīng)compile),可以進(jìn)行管理,下面這篇文章主要給大家介紹了關(guān)于springboot3整合knife4j的相關(guān)資料,需要的朋友可以參考下2024-03-03
SpringSecurity微服務(wù)實戰(zhàn)之公共模塊詳解
這篇文章主要為大家介紹了SpringSecurity微服務(wù)實戰(zhàn)之公共模塊詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Java解析JSON數(shù)據(jù)時報錯問題解決方案
這篇文章主要介紹了Java解析JSON數(shù)據(jù)時報錯問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10
Java實現(xiàn)SM3withSM2簽名和驗證的基本示例
這篇文章主要介紹了Java實現(xiàn)SM3withSM2簽名和驗證的基本示例,SM3withSM2是一種在Java中使用的密碼學(xué)算法組合,結(jié)合了橢圓曲線公鑰密碼算法SM2和密碼哈希算法SM3,它主要用于數(shù)字簽名和數(shù)據(jù)完整性校驗,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
Java File類 mkdir 不能創(chuàng)建多層目錄的解決
這篇文章主要介紹了Java File類 mkdir 不能創(chuàng)建多層目錄的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Spring基于ProxyFactoryBean創(chuàng)建AOP代理
這篇文章主要介紹了Spring基于ProxyFactoryBean創(chuàng)建AOP代理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10
基于java時區(qū)轉(zhuǎn)換夏令時的問題及解決方法
下面小編就為大家分享一篇基于java時區(qū)轉(zhuǎn)換夏令時的問題及解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11
intellij idea設(shè)置統(tǒng)一JavaDoc模板的方法詳解
這篇文章主要介紹了intellij idea設(shè)置統(tǒng)一JavaDoc模板的方法詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04

