校驗碼圖片生成

qking93415981發表於2020-04-06

     在B/S結構專案中,為防止別心用心的使用者嘗試登入通常採用生成校驗碼圖片的方式進行控制,圖片中的數字是隨機生成的。以下程式碼是具體實現方法:   

圖片生成實用類:
  1. import java.awt.*;   
  2. import java.awt.image.*;   
  3. import java.util.*;   
  4.   
  5. public class ImageCode {   
  6.   
  7.     public String sRand = "";   
  8.   
  9.     public Color getRandColor(int fc, int bc) {// 給定範圍獲得隨機顏色   
  10.         Random random = new Random();   
  11.         if (fc > 255)   
  12.             fc = 255;   
  13.         if (bc > 255)   
  14.             bc = 255;   
  15.         int r = fc + random.nextInt(bc - fc);   
  16.         int g = fc + random.nextInt(bc - fc);   
  17.         int b = fc + random.nextInt(bc - fc);   
  18.         return new Color(r, g, b);   
  19.     }   
  20.   
  21.     public BufferedImage creatImage() {   
  22.         // 在記憶體中建立圖象   
  23.         int width = 60, height = 20;   
  24.         BufferedImage image = new BufferedImage(width, height,   
  25.                 BufferedImage.TYPE_INT_RGB);   
  26.         // 獲取圖形上下文   
  27.         Graphics g = image.getGraphics();   
  28.         // 生成隨機類   
  29.         Random random = new Random();   
  30.         // 設定背景色   
  31.         g.setColor(getRandColor(200250));   
  32.         g.fillRect(00, width, height);   
  33.         // 設定字型   
  34.         g.setFont(new Font("Times New Roman", Font.PLAIN, 18));   
  35.   
  36.         // 隨機產生155條干擾線,   
  37.         g.setColor(getRandColor(160200));   
  38.         for (int i = 0; i < 155; i++) {   
  39.             int x = random.nextInt(width);   
  40.             int y = random.nextInt(height);   
  41.             int xl = random.nextInt(12);   
  42.             int yl = random.nextInt(12);   
  43.             g.drawLine(x, y, x + xl, y + yl);   
  44.         }   
  45.         // 取隨機產生的認證碼(4位數字)   
  46.         for (int i = 0; i < 4; i++) {   
  47.             String rand = String.valueOf(random.nextInt(10));   
  48.             sRand += rand;   
  49.             // 將認證碼顯示到圖象中   
  50.             g.setColor(new Color(20 + random.nextInt(110), 20 + random   
  51.                     .nextInt(110), 20 + random.nextInt(110)));// 呼叫函式出來的顏色相同,可能是因為種子太接近,所以只能直接生成   
  52.             g.drawString(rand, 13 * i + 616);   
  53.         }   
  54.         // 圖象生效   
  55.         g.dispose();   
  56.         return image;   
  57.     }   
  58.   
  59.     /**  
  60.      * @return Returns the sRand.  
  61.      */  
  62.     public String getSRand() {   
  63.         return sRand;   
  64.     }   
  65. }  
生成圖片的servlet:
  1. import java.awt.image.BufferedImage;   
  2. import java.io.IOException;   
  3.   
  4. import javax.imageio.ImageIO;   
  5. import javax.servlet.ServletException;   
  6. import javax.servlet.http.HttpServlet;   
  7. import javax.servlet.http.HttpServletRequest;   
  8. import javax.servlet.http.HttpServletResponse;   
  9.   
  10. /**  
  11.  * 生成隨機驗證碼圖片  
  12.  *   
  13.  * @author lixy 2007-7-16 11:16:50  
  14.  *   
  15.  */  
  16. public class RandomImgCodeServlet extends HttpServlet {   
  17.   
  18.     public void doGet(HttpServletRequest request, HttpServletResponse response)   
  19.             throws ServletException, IOException {   
  20.   
  21.         response.setContentType("image/jpeg");   
  22.         ImageCode image = new ImageCode();   
  23.         response.setHeader("Pragma""No-cache");   
  24.         response.setHeader("Cache-Control""no-cache");   
  25.         response.setDateHeader("Expires"0);   
  26.         try {   
  27.             // 輸出圖象到頁面   
  28.             BufferedImage img = image.creatImage();   
  29.             request.getSession().setAttribute("rand", image.getSRand());   
  30.             //System.out.println("image Rand Code = "+image.getSRand());   
  31.             ImageIO.write(img, "JPEG", response.getOutputStream());   
  32.             response.getOutputStream().flush();   
  33.             response.getOutputStream().close();   
  34.         } catch (Exception e) {   
  35.             System.out.println("錯誤:" + e);   
  36.         }   
  37.     }   
  38.   
  39. }  

       記得在web.xml中對上面這個servlet進行配置,我的配置是:   

xml 程式碼
  1. <servlet>      
  2.     <servlet-name>RandomImgCodeServletservlet-name>      
  3.     <servlet-class>org.lixy.util.RandomImgCodeServletservlet-class>      
  4. <servlet>         
  5. <servlet-mapping>      
  6.     <servlet-name>RandomImgCodeServletservlet-name>      
  7.     <url-pattern>/servlet/randomImgCodeServleturl-pattern>      
  8. <servlet-mapping>  

 

        在需要放置此圖片的地方加入如下程式碼: 

html程式碼
  1. <img src="/servlet/randomImgCodeServlet"  class="imageRandom" height="18px"/>  

        大功告成了。。。呵呵,簡單吧

 

相關文章