之前一直覺得會生成驗證碼的人都是元老級人物,直到今天我很幸學(xué)到了生成動態(tài)驗證碼的方法边篮,其實并沒有想象中的那么難嘛鸽凶,所以篮赢,我將所學(xué)的分享給廣大的即將要從成為程序猿的們齿椅,希望大家多提點意見。
前端展示頁面
<script type="text/javascript">
function changeCode(){
var imgObj = document.getElementById("img");
imgObj.src = "CheckCodeServlet?id="+new Date();
}
</script>
<body>
<span style="color:red;">${errorMsg}</span>
<form action="DealCheckcodeServlet" method="post">
<input type="text" name="code"/>
<i.m.g src="CheckCodeServlet" id="img" onclick="changeCode()"><!--由于markdown格式會將img自動轉(zhuǎn)化成圖片格式启泣,所以我用的是i.m.g--!>
<input type="submit"/>
</form>
</body>
servlet頁面一:CheckCodeServlet
主要完成驗證碼的生成
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Random r = new Random();
// 1.確定圖片的大小
int w = 100;
int h = 30;
// 2.創(chuàng)建畫板
BufferedImage board = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
// 3.創(chuàng)建畫筆
Graphics pen = board.getGraphics();
// 4.調(diào)制顏色
Color c_bg = new Color(200 + r.nextInt(40), 200 + r.nextInt(40), 200 + r.nextInt(40));
// 5.給畫筆注入當(dāng)前的背景要繪制的顏色
pen.setColor(c_bg);
// 6.畫背景
pen.fillRect(0, 0, w, h);
String judgeCode = "";
for (int i = 1; i < 5; i++) {
// 生成一位隨機驗證碼
// 7.生成驗證碼
// 改變畫筆的顏色媒咳,防止與背景顏色相同
Color c_code = new Color(100 + r.nextInt(40), 100 + r.nextInt(40), 100 + r.nextInt(40));
// 給畫筆注入驗證碼的顏色
pen.setColor(c_code);
// 設(shè)置畫筆所畫出的字體風(fēng)格
Font f_code = new Font("斜體", Font.ITALIC, 18);
// 將字體風(fēng)格注入筆中
pen.setFont(f_code);
// 隨機生成一個大寫字母Unicode(ASCII碼)
int upcaseCode = 65 + r.nextInt(26);
// 隨機生成一個小寫字母的Unicode
int lowcaseCode = 97 + r.nextInt(26);
// 隨機生成數(shù)字
int numCode = r.nextInt(10);
// 轉(zhuǎn)化成具體的字符串,字符串可以追加起來
// 將字母所對應(yīng)的碼轉(zhuǎn)化成相應(yīng)的字母
String upcaseStr = String.valueOf((char) upcaseCode);
String lowcaseStr = String.valueOf((char) lowcaseCode);
String numStr = String.valueOf(numCode);
// n1與n2的值是0或者1
int n1 = r.nextInt(2);
int n2 = r.nextInt(2);
String code = "";
if (n1 > 0.5) {
// 生成的是字母
// 生成大寫字母
if (n2 > 0.5) {
code = upcaseStr;
judgeCode = judgeCode + upcaseStr;
} else {
// 生成小寫字母
code = lowcaseStr;
judgeCode = judgeCode + lowcaseStr;
}
} else {
// 生成數(shù)字
code = numStr;
judgeCode = judgeCode + numStr;
}
request.getSession().setAttribute("judgeCode",judgeCode);
System.out.println(judgeCode);
// 畫驗證碼(20*i, 20是驗證碼的位置)
pen.drawString(code, 20*i, 20);
}
// 壓縮成圖片种远,做成響應(yīng)輸出
ImageIO.write(board, "jpg", response.getOutputStream());
}
servlet頁面二:DealCheckcodeServlet
主要完成驗證碼的刷新以及正確判斷
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String code = request.getParameter("code");
String jugdeCode = (String)request.getSession().getAttribute("judgeCode");
System.out.println(jugdeCode);
if(code.equalsIgnoreCase(jugdeCode)){
request.getRequestDispatcher("welcome.jsp").forward(request, response);
}else{
String errorMsg = "驗證碼有錯誤";
request.setAttribute("errorMsg", errorMsg);
request.getRequestDispatcher("judgeCode.jsp").forward(request, response);
}
}
部分運行效果展示
完整的項目,github,大家自行下載顽耳。