在開發中驗證碼是比較常用到有效防止這種問題對某一個特定注冊用戶用特定程序暴力破解方式進行不斷的登陸嘗試的方式。
此演示程序包括三個文件:
1.index.jsp:登錄頁面
2.image.jsp:生成驗證碼圖片頁面
3.result.jsp:結果頁面
【頁面顯示】
【頁面代碼】
1.index.jsp
xml 代碼
01.<html><body>
02.<form method=post action="result.jsp">
03.<input type=text name=input maxlength=4>
04.<img border=0 src="image.jsp">
05.<input type="submit" value="submit">
06.</form></body></html>
[注意]:(1)使用maxlength屬性來限制輸入字符;
(2)使用<img>標簽來顯示生成的驗證碼圖片.
2.image.jsp
01.<%@ page contentType="image/JPEG"
02. import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"
03. pageEncoding="GBK"%>
04.<%!Color getRandColor(int fc, int bc) {//給定范圍獲得隨機顏色
05. Random random = new Random();
06. if (fc > 255)
07. fc = 255;
08. if (bc > 255)
09. bc = 255;
10. int r = fc + random.nextInt(bc - fc);
11. int g = fc + random.nextInt(bc - fc);
12. int b = fc + random.nextInt(bc - fc);
13. return new Color(r, g, b);
14. }%>
15.<%
16. //設置頁面不緩存
17. response.setHeader("Pragma", "No-cache");
18. response.setHeader("Cache-Control", "no-cache");
19. response.setDateHeader("Expires", 0);
20.
21. // 在內存中創建圖象
22. int width = 60, height = 20;
23. BufferedImage image = new BufferedImage(width, height,
24. BufferedImage.TYPE_INT_RGB);
25.
26. // 獲取圖形上下文
27. Graphics g = image.getGraphics();
28.
29. //生成隨機類
30. Random random = new Random();
31.
32. // 設定背景色
33. g.setColor(getRandColor(200, 250));
34. g.fillRect(0, 0, width, height);
35.
36. //設定字體
37. g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
38.
39. //畫邊框 www.2cto.com
40. //g.setColor(new Color());
41. //g.drawRect(0,0,width-1,height-1);
42.
43. // 隨機產生155條干擾線,使圖象中的認證碼不易被其它程序探測到
44. g.setColor(getRandColor(160, 200));
45. for (int i = 0; i < 100; i++) {
46. int x = random.nextInt(width);
47. int y = random.nextInt(height);
48. int xl = random.nextInt(12);
49. int yl = random.nextInt(12);
50. g.drawLine(x, y, x + xl, y + yl);
51. }
52.
53. // 取隨機產生的認證碼(4位數字)
54. String sRand = "";
55. for (int i = 0; i < 4; i++) {
56. String rand = String.valueOf(random.nextInt(10));
57. sRand += rand;
58. // 將認證碼顯示到圖象中
59. g.setColor(new Color(20 + random.nextInt(110), 20 + random
60. .nextInt(110), 20 + random.nextInt(110)));//調用函數出來的顏色相同,可能是因為種子太接近,所以只能直接生成
61. g.drawString(rand, 13 * i + 6, 16);
62. }
63.
64. // 將認證碼存入SESSION
65. session.setAttribute("code", sRand);
66.
67. // 圖象生效
68. g.dispose();
69.
70. // 輸出圖象到頁面
71. ImageIO.write(image, "JPEG", response.getOutputStream());
72.%>
[注意]:
(1)contentType值設置為"image/JPEG"
3.result.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
01.<html><body>
02.<%
03. String input=request.getParameter("input");
04. String code=(String)session.getAttribute("code");
05. if(input.equals(code)){
06. out.println("驗證成功!");
07. }else{
08. out.println("驗證失敗!");
09. }
10.%>
11.body>html>
摘自 ___loveOfForever