1. 程式人生 > >Java 驗證碼詳解

Java 驗證碼詳解

hash rand map builder white form fixed sys ssi

  1 使用Servlet實現驗證碼,涉及的知識點主要為java 繪圖技術與session保存數據。

   HTML頁面

 1 <html>
 2 <image src=‘images/logo1.jpg‘ /><hr/>
 3 <head><br/><title>登錄</title> <br/><h1> 歡迎登錄</h1></head>
 4 <body>
 5 <form action=‘/LoginValid/LoginVerify‘ method
=‘post‘ > 6 用戶id:<input type=‘text‘ name=‘userid‘ value=‘‘> 7 用戶密碼:<input type=‘password‘ name=‘password‘ value=‘‘> 9 驗證碼:<input type=‘text‘ name=‘inputCode‘ /> <img id=‘imgObj‘ src=‘/LoginValid/CreateCode2‘ /><a href=‘javascript:changeImg()‘ >換一張</a> 10 <
input type=‘submit‘ value=‘登錄‘ /> 11 </form> 12 </body>
13 <script type=‘text/javascript‘> 14 function changeImg() {
var time = new Date();
document.getElementById(
imgObj).src=/LoginValid/CreateCode2?d=+time;
}
15 </script> 16 </html>

  

  生成驗證碼的工具類

 1 public
class CodeUtil { 2 3 //圖片寬度 4 private static final int IMG_W=120; 5 //圖片高度 6 private static final int IMG_H=30; 7 //驗證碼字符個數 8 private static final int NUM_CHS=5; 9 //驗證碼包含的具體字符 10 private static char[] chs = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890".toCharArray(); 11 private static Random rand = new Random(); 12 13 //圖片x軸,y軸的位置基數 14 private static int codeX = 20; 15 private static int codeY = 25; 16 17 //字體大小 18 private static int fontH = 25; 19 20 public static Map<String, Object> generateImage() 21 { 22 BufferedImage image = new BufferedImage(IMG_W, IMG_H, BufferedImage.TYPE_INT_RGB); 23 Graphics g = image.getGraphics(); 24 25 //設置圖片背景色為白色 26 g.setColor(Color.WHITE); 27 g.fillRect(0, 0, IMG_W, IMG_H); 28 29 //設置字體大小 30 Font font = new Font("Fixedsys", Font.BOLD, fontH); 31 g.setFont(font); 32 33 //畫邊框 34 g.setColor(Color.BLACK); 35 g.drawRect(0, 0, IMG_W, IMG_H); 36 37 g.setColor(Color.BLACK); 38 //隨機產生30條幹擾線 39 for(int i=0; i<30; i++) 40 { 41 int x = rand.nextInt(IMG_W); 42 int y = rand.nextInt(IMG_H); 43 int xl = rand.nextInt(20); 44 int yl = rand.nextInt(20); 45 46 g.drawLine(x, y, xl, yl); 47 } 48 49 StringBuilder sb = new StringBuilder(); 50 for(int i=0; i<NUM_CHS; i++) 51 { 52 //從字符串中隨機獲取一個字符 53 String code = String.valueOf(chs[rand.nextInt(chs.length)]); 54 //隨機設置畫筆顏色 55 g.setColor(new Color(rand.nextInt(255),rand.nextInt(255),rand.nextInt(255))); 56 g.drawString(code, (i+1)*codeX, codeY); 57 sb.append(code); 58 } 59 60 Map<String, Object> map = new HashMap<String, Object>(); 61 map.put("code", sb.toString()); 62 map.put("codeImage", image); 63 return map; 64 65 } 66 67 }

  後臺產生驗證碼的Servlet

 1         //禁止瀏覽器緩存隨機圖片
 2         response.setDateHeader("Expires",-1);
 3         response.setHeader("Cache-Control", "no-cache");
 4         response.setHeader("Pragma", "no-cache");
 5         
 6         //通知客戶端以圖片的方式打開發送過去的數據
 7         response.setHeader("Content-Type", "image/jpeg");
 8         
 9         Map<String, Object> map = CodeUtil.generateImage();
10         //將驗證碼保存至session
11         request.getSession().setAttribute("checkCode", map.get("code"));
12         ImageIO.write((RenderedImage)map.get("codeImage"), "jpg", response.getOutputStream());

  後臺驗證用戶輸入的驗證碼與顯示的是否一致的Servlet類

 2         HttpSession session = request.getSession();
 3         String seCode = (String)session.getAttribute("checkCode");
 4         String inputCode = (String)request.getParameter("inputCode");
 5         if(seCode.equals(inputCode))
 6         {
 7             request.getRequestDispatcher("/Main").forward(request, response);
 8         }
 9         else
10         {
11             request.getRequestDispatcher("/Err").forward(request, response);
12         }

  

Java 驗證碼詳解