springMVC--動態驗證碼實現


在網站開發過程中我們一般都會為了防止用戶連續提交都會提供驗證碼的功能,簡單來說就是生成一個動態圖片,在圖片中保存一些校驗信息,將校驗信息放到session中和用戶提交的驗證碼信息進行對比,如果出現錯誤則要提示驗證碼錯誤。

提供一個簡單實現的demo。

  1. @Controller  
  2. @RequestMapping("/auth")  
  3. public class AuthCodeController {  
  4.       
  5.     private char[] codeSequence = { 'A''1','B''C''2','D','3''E','4''F''5','G','6''H''7','I''8','J',  
  6.             'K',   '9' ,'L''1','M',  '2','N',  'P''3''Q''4''R''S''T''U''V''W',  
  7.             'X''Y''Z'};  
  8.       
  9.     @RequestMapping("/code")  
  10.     public void getCode(HttpServletResponse response,HttpSession session) throws IOException{  
  11.         int width = 63;  
  12.         int height = 37;  
  13.         Random random = new Random();  
  14.         //設置response頭信息  
  15.         //禁止緩存  
  16.         response.setHeader("Pragma""No-cache");  
  17.         response.setHeader("Cache-Control""no-cache");  
  18.         response.setDateHeader("Expires"0);  
  19.   
  20.         //生成緩沖區image類  
  21.         BufferedImage image = new BufferedImage(width, height, 1);  
  22.         //產生image類的Graphics用於繪制操作  
  23.         Graphics g = image.getGraphics();  
  24.         //Graphics類的樣式  
  25.         g.setColor(this.getColor(200250));  
  26.         g.setFont(new Font("Times New Roman",0,28));  
  27.         g.fillRect(00, width, height);  
  28.         //繪制干擾線  
  29.         for(int i=0;i<40;i++){  
  30.             g.setColor(this.getColor(130200));  
  31.             int x = random.nextInt(width);  
  32.             int y = random.nextInt(height);  
  33.             int x1 = random.nextInt(12);  
  34.             int y1 = random.nextInt(12);  
  35.             g.drawLine(x, y, x + x1, y + y1);  
  36.         }  
  37.   
  38.         //繪制字符  
  39.         String strCode = "";  
  40.         for(int i=0;i<4;i++){  
  41.             String rand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);  
  42.             strCode = strCode + rand;  
  43.             g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));  
  44.             g.drawString(rand, 13*i+628);  
  45.         }  
  46.         //將字符保存到session中用於前端的驗證  
  47.         session.setAttribute("authCode", strCode.toLowerCase());  
  48.         g.dispose();  
  49.   
  50.         ImageIO.write(image, "JPEG", response.getOutputStream());  
  51.         response.getOutputStream().flush();  
  52.     }  
  53.       
  54.     public  Color getColor(int fc,int bc){  
  55.         Random random = new Random();  
  56.         if(fc>255)  
  57.             fc = 255;  
  58.         if(bc>255)  
  59.             bc = 255;  
  60.         int r = fc + random.nextInt(bc - fc);  
  61.         int g = fc + random.nextInt(bc - fc);  
  62.         int b = fc + random.nextInt(bc - fc);  
  63.         return new Color(r,g,b);  
  64.     }  
  65.       
  66. }  
在jsp文件中請求這個圖片地址

  1. <label><img type="image" src="/auth/code" id="codeImage"  style="cursor:pointer;"/></label>  
效果:




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM