這篇文章給大家分享的是有關如何用java來生成后臺驗證碼的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。
我們先來看下效果:

一、適用需求
后臺生成驗證碼,用于登陸驗證。
二、實現流程
1、視圖層思路
(1)input用于輸入驗證碼,一個img用于展示驗證碼
(2)校驗輸入的驗證碼是否合格,雙擊img刷新驗證碼,綁定onblue失去焦點事件(鼠標失去焦點時觸發的事件)
(3)onblue事件中做校驗,
(4)img中的src屬性值為后臺生成驗證碼的方法請求路徑(即requestMapping的路徑),當再點擊驗證碼的時候,再動態設置src屬性即可(原訪問地址+隨機時間戳,防止同一路徑瀏覽器不另做訪問的問題)
注意:后臺直接返回圖片,不是驗證碼的字符!若返回字符,則驗證碼就失去了意義(前臺很容易就可以獲取驗證碼字符,進行多次惡意訪問了)(這點考慮了系統安全性)
2、后端思路
利用BufferedImage類創建一張圖片,再用Graphics2D對圖片進行繪制(生成隨機字符,添加干擾線)即可,注意:生成的驗證碼字符串要放到session中,用于接下來登陸的驗證碼驗證(當然也是后臺)。
前端代碼如下:
<td class="tds">驗證碼:</td>
<td>
<input type="text" name="valistr" onblur="checkNull('valistr','驗證碼不能為空!')">
<img id="yzm_img" src="${pageContext.request.contextPath}/servlet/ValiImgServlet" style="cursor: pointer" onclick="changeYZM(this)"/>
<span id="valistr_msg"></span>
</td>
/**
* 校驗字段是否為空
*/
function checkNull(name,msg){
setMsg(name,"")
var v = document.getElementsByName(name)[0].value;
if(v == ""){
setMsg(name,msg)
return false;
}
return true;
}
/**
* 為輸入項設置提示消息
*/
function setMsg(name,msg){
var span = document.getElementById(name+"_msg");
span.innerHTML="<font color='red'>"+msg+"</font>";
}
/**
* 點擊更換驗證碼
*/
function changeYZM(imgObj){
imgObj.src = "${pageContext.request.contextPath}/servlet/ValiImgServlet?time="+new Date().getTime();
}后端代碼如下:
package cn.tedu.web;
import cn.tedu.util.VerifyCode;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* 獲取驗證碼
*/
public class ValiImgServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//禁止瀏覽器緩存驗證碼
response.setDateHeader("Expires",-1);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
//生成驗證碼
VerifyCode vc = new VerifyCode();
//輸出驗證碼
vc.drawImage(response.getOutputStream());
//獲取驗證碼的值,存儲到session中
String valistr = vc.getCode();
HttpSession session = request.getSession();
session.setAttribute("valistr",valistr);
//打印到控制臺
System.out.println(valistr);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}package cn.tedu.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
/**
* 動態生成圖片
*/
public class VerifyCode {
// {"宋體", "華文楷體", "黑體", "華文新魏", "華文隸書", "微軟雅黑", "楷體_GB2312"}
private static String[] fontNames = { "宋體", "華文楷體", "黑體", "微軟雅黑", "楷體_GB2312" };
// 可選字符
//"23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";
private static String codes = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";
// 背景色
private Color bgColor = new Color(255, 255, 255);
// 基數(一個文字所占的空間大小)
private int base = 30;
// 圖像寬度
private int width = base * 4;
// 圖像高度
private int height = base;
// 文字個數
private int len = 4;
// 設置字體大小
private int fontSize = 22;
// 驗證碼上的文本
private String text;
private BufferedImage img = null;
private Graphics2D g2 = null;
/**
* 生成驗證碼圖片
*/
public void drawImage(OutputStream outputStream) {
// 1.創建圖片緩沖區對象, 并設置寬高和圖像類型
img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 2.得到繪制環境
g2 = (Graphics2D) img.getGraphics();
// 3.開始畫圖
// 設置背景色
g2.setColor(bgColor);
g2.fillRect(0, 0, width, height);
StringBuffer sb = new StringBuffer();// 用來裝載驗證碼上的文本
for (int i = 0; i < len; i++) {
// 設置畫筆顏色 -- 隨機
// g2.setColor(new Color(255, 0, 0));
g2.setColor(new Color(getRandom(0, 150), getRandom(0, 150),getRandom(0, 150)));
// 設置字體
g2.setFont(new Font(fontNames[getRandom(0, fontNames.length)], Font.BOLD, fontSize));
// 旋轉文字(-45~+45)
int theta = getRandom(-45, 45);
g2.rotate(theta * Math.PI / 180, 7 + i * base, height - 8);
// 寫字
String code = codes.charAt(getRandom(0, codes.length())) + "";
g2.drawString(code, 7 + i * base, height - 8);
sb.append(code);
g2.rotate(-theta * Math.PI / 180, 7 + i * base, height - 8);
}
this.text = sb.toString();
// 畫干擾線
for (int i = 0; i < len + 2; i++) {
// 設置畫筆顏色 -- 隨機
// g2.setColor(new Color(255, 0, 0));
g2.setColor(new Color(getRandom(0, 150), getRandom(0, 150),
getRandom(0, 150)));
g2.drawLine(getRandom(0, 120), getRandom(0, 30), getRandom(0, 120),
getRandom(0, 30));
}
//TODO:
g2.setColor(Color.GRAY);
g2.drawRect(0, 0, this.width-1, this.height-1);
// 4.保存圖片到指定的輸出流
try {
ImageIO.write(this.img, "JPEG", outputStream);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}finally{
// 5.釋放資源
g2.dispose();
}
}
/**
* 獲取驗證碼字符串
* @return
*/
public String getCode() {
return this.text;
}
/*
* 生成隨機數的方法
*/
private static int getRandom(int start, int end) {
Random random = new Random();
return random.nextInt(end - start) + start;
}
/*public static void main(String[] args) throws Exception {
VerifyCode vc = new VerifyCode();
vc.drawImage(new FileOutputStream("f:/vc.jpg"));
System.out.println("執行成功~!");
}*/
}總結:
簡介:是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動區分計算機和人類的圖靈測試)的縮寫,是一種區分用戶是計算機還是人的公共全自動程序。
歷史:是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動區分計算機和人類的圖靈測試)的縮寫,是一種區分用戶是計算機還是人的公共全自動程序。
作用:防止惡意破解密碼、刷票、論壇灌水、刷頁。
分類:Gif動畫驗證碼,手機短信驗證碼,手機語音驗證碼,視頻驗證碼
常見的驗證碼:
(1)四位數字和字母,可能都是字母,也可能都是數字,隨機的4位字符串,最原始的驗證碼,驗證作用幾乎為零。CSDN網站用戶登錄用的是GIF格式,常用的隨機數字圖片驗證碼。圖片上的字符比較中規中矩,驗證作用比上一個好。
(2)漢字是注冊目前最新的驗證碼,隨機生成,打起來比較難,例如QQ申訴頁面。
(3)MS的hotmail申請時候的是BMP格式, 隨機數字+隨機大寫英文字母+隨機干擾像素+隨機位置。
(4)韓文或日文,現在跑跑HF上MS注冊要打韓文,增加了難度。
(5)Google的Gmail注冊時候的是JPG格式,隨機英文字母+隨機顏色+隨機位置+隨機長度。
(6)其他各大論壇的是XBM格式,內容隨機
(7)廣告驗證碼:輸入廣告中的部分內容即可,特點是可以給網站帶來額外收入,也可以使使用者耳目一新。 廣告驗證碼
(8)問題驗證碼:問題驗證碼主要是以問答式的形式來進行填寫。它的查看比加模驗證碼更容易辨別和錄入,系統可以生成諸如“1+2=?”的問題讓用戶進行回答,當然這樣的問題是隨機生成的。另一種問題驗證碼,則是文字式的問題驗證碼,諸如生成問題“中國的全稱是什么?”,當然有些網站還在問題后面給出了提示答案或直接答案。
感謝各位的閱讀!關于如何用java來生成后臺驗證碼就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。