Java后端產(chǎn)生驗證碼后臺驗證功能的實現(xiàn)代碼
直接跳severlet在java后臺生成驗證碼:
@RequestMapping(value="yzm.action")
public void Yzm(HttpSession session,HttpServletResponse resp){
// 驗證碼圖片的寬度。
int width = 60;
// 驗證碼圖片的高度。
int height = 20;
// 驗證碼字符個數(shù)
int codeCount = 4;
int x = 0;
// 字體高度
int fontHeight;
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', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
x = width / (codeCount + 1);
fontHeight = height - 2;
codeY = height - 4;
BufferedImage buffImg = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics();
// 創(chuàng)建一個隨機數(shù)生成器類
Random random = new Random();
// 將圖像填充為白色
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
// 創(chuàng)建字體,字體的大小應(yīng)該根據(jù)圖片的高度來定。
Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);
// 設(shè)置字體。
g.setFont(font);
// 畫邊框。
// g.setColor(Color.BLACK);
// g.drawRect(0, 0, width - 1, height - 1);
// 隨機產(chǎn)生160條干擾線,使圖象中的認證碼不易被其它程序探測到。
g.setColor(Color.BLACK);
for (int i = 0; i < 1; i++) {
int x2 = random.nextInt(width);
int y2 = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x2, y2, x + xl, y2 + yl);
}
// randomCode用于保存隨機產(chǎn)生的驗證碼,以便用戶登錄后進行驗證。
StringBuffer randomCode = new StringBuffer();
int red = 0, green = 0, blue = 0;
// 隨機產(chǎn)生codeCount數(shù)字的驗證碼。
for (int i = 0; i < codeCount; i++) {
// 得到隨機產(chǎn)生的驗證碼數(shù)字。
String strRand = String.valueOf(codeSequence[random.nextInt(36)]);
// 產(chǎn)生隨機的顏色分量來構(gòu)造顏色值,這樣輸出的每位數(shù)字的顏色值都將不同。
red = random.nextInt(255);
green = random.nextInt(255);
blue = random.nextInt(255);
// 用隨機產(chǎn)生的顏色將驗證碼繪制到圖像中。
g.setColor(new Color(red, green, blue));
g.drawString(strRand, (i + 1) * x, codeY);
// 將產(chǎn)生的四個隨機數(shù)組合在一起。
randomCode.append(strRand);
}
// 將四位數(shù)字的驗證碼保存到Session中。
session.setAttribute("validateCode", randomCode.toString());
ServletOutputStream sos;
try {
sos = resp.getOutputStream();
ImageIO.write(buffImg, "jpeg", sos);
sos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
jsp顯示頁面的代碼,點擊圖片刷新
<td><img id="img" src="yzm.action"/>${validateCode}</td>
<td><input type="text" name="yzma"/><br/></td>
$("#img").click(function(){
$(this).attr("src","yzm.action?"+new Date().getTime());
});
將文本框中的值傳入后臺,與最開始生成驗證碼的隨機數(shù)進行比較即可完成驗證。

頁面上拿到的session的值老是比驗證碼晚一步,所以采取后臺進行驗證。這里我也不知道什么原因,望小伙伴們告知。。。
另一種思路,后臺生成隨機數(shù),前端生成畫布,用ajax拿隨機數(shù)
//后臺只生成隨機數(shù)
@RequestMapping(value="random.action")
public void findRandom (HttpServletResponse response) throws IOException{
// 驗證碼字符個數(shù)
int codeCount = 4;
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', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
// 創(chuàng)建一個隨機數(shù)生成器類
Random random = new Random();
// randomCode用于保存隨機產(chǎn)生的驗證碼,以便用戶登錄后進行驗證。
StringBuffer randomCode = new StringBuffer();
for (int i = 0; i < codeCount; i++) {
// 得到隨機產(chǎn)生的驗證碼數(shù)字。
String strRand = String.valueOf(codeSequence[random.nextInt(36)]);
// 將產(chǎn)生的四個隨機數(shù)組合在一起。
randomCode.append(strRand);
}
PrintWriter out = response.getWriter();
out.print(randomCode);
}
jsp,jq,js代碼
<body>
<canvas id="canvas" width="70" height="34"></canvas>
<a href="javascript:;" rel="external nofollow" id="img" class="pull-right" style="line-height: 34px;text-indent: 10px;">換一張</a>
<input type="text" class="form-control" id="yzms" name="yzms" readonly = "readonly" style="display:none" >
</body>
<script type="text/javascript">
$.ajax({
url:"random.action",
success:function(k){
console.log(k)
$("#yzms").attr("value",k);
drawPic();
}
})
$("#img").on("click",function(){
var _this=$(this)
$.ajax({
url:"random.action",
success:function(k){
console.log(k)
$("#yzms").attr("value",k);
drawPic();
}
})
})
/**生成一個隨機數(shù)**/
function randomNum(min,max){
return Math.floor( Math.random()*(max-min)+min);
}
/**生成一個隨機色**/
function randomColor(min,max){
var r = randomNum(min,max);
var g = randomNum(min,max);
var b = randomNum(min,max);
return "rgb("+r+","+g+","+b+")";
}
/**繪制驗證碼圖片**/
function drawPic(){
var canvas=document.getElementById("canvas");
var width=canvas.width;
var height=canvas.height;
var ctx = canvas.getContext('2d');
ctx.textBaseline = 'bottom';
/**繪制背景色**/
ctx.fillStyle = randomColor(180,240); //顏色若太深可能導(dǎo)致看不清
ctx.fillRect(0,0,width,height);
/**繪制文字**/
/* for(var i=0; i<4; i++){ */
var txt = $("#yzms").attr("value");
ctx.fillStyle = randomColor(50,160); //隨機生成字體顏色
ctx.font = randomNum(15,20)+'px SimHei'; //隨機生成字體大小
var x = 20;
var y = randomNum(20,30);
var deg = randomNum(-45, 45);
//修改坐標原點和旋轉(zhuǎn)角度
ctx.translate(x,y);
ctx.rotate(deg*Math.PI/180);
ctx.fillText(txt, 0,0);
//恢復(fù)坐標原點和旋轉(zhuǎn)角度
ctx.rotate(-deg*Math.PI/180);
ctx.translate(-x,-y);
/* } */
/* /**繪制干擾線**/
for(var i=0; i<8; i++){
ctx.strokeStyle = randomColor(40,180);
ctx.beginPath();
ctx.moveTo( randomNum(0,width), randomNum(0,height) );
ctx.lineTo( randomNum(0,width), randomNum(0,height) );
ctx.stroke();
}
/**繪制干擾點**/
/* for(var i=0; i<100; i++){
ctx.fillStyle = randomColor(0,255);
ctx.beginPath();
ctx.arc(randomNum(0,width),randomNum(0,height), 1, 0, 2*Math.PI);
ctx.fill();
} */
}
效果展示:

總結(jié)
以上所述是小編給大家介紹的Java后端產(chǎn)生驗證碼后臺驗證功能的實現(xiàn)代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
Java面向?qū)ο蠡A(chǔ)知識之委托和lambda
這篇文章主要介紹了Java面向?qū)ο蟮闹泻?lambda,文中有非常詳細的代碼示例,對正在學(xué)習java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下2021-11-11
java并發(fā)編程工具類PriorityBlockingQueue優(yōu)先級隊列
這篇文章主要為大家介紹了java并發(fā)編程工具類PriorityBlockingQueue優(yōu)先級隊列的方法示例應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-03-03
java利用pdfbox+poi往pdf插入數(shù)據(jù)
這篇文章主要給大家介紹了關(guān)于java利用pdfbox+poi如何往pdf插入數(shù)據(jù)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下2022-02-02
Java中的反射,枚舉及l(fā)ambda表達式的使用詳解
這篇文章主要為大家詳細介紹了Java的反射,枚舉及l(fā)ambda表達式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
Apache Dubbo的SPI機制是如何實現(xiàn)的
SPI全稱為Service Provider Interface,對應(yīng)中文為服務(wù)發(fā)現(xiàn)機制。SPI類似一種可插拔機制,首先需要定義一個接口或一個約定,然后不同的場景可以對其進行實現(xiàn),調(diào)用方在使用的時候無需過多關(guān)注具體的實現(xiàn)細節(jié)。在Java中,SPI體現(xiàn)了面向接口編程的思想,滿足開閉設(shè)計原則。2021-06-06

