1. 程式人生 > >專案案例 || 註冊中驗證碼實現

專案案例 || 註冊中驗證碼實現

今天,給大家介紹驗證碼的相關配置問題。

眾所周知,對傳統驗證碼而言,便捷和安全長期以來一直是魚與熊掌的關係。

這可從12306與黃牛的博弈中看出端倪。

最先開始,只是簡單的數字英文組合,再後來有了加減法,相信一般人也可以應付。

直到出現一閃一閃的動態驗證碼和變形字母,第一次體會到眼睛都快看瞎了,還有輸不對的情況~

 

但這些與後來的圖片驗證碼相比,還只是小兒科,不信你看:

 

網友戲稱:不懂娛樂圈,沒資格買票回家。

 

驗證碼相關配置

 

不過對於我們一般小型系統而言,那麼複雜的驗證碼確實沒必要,簡單的英文數字組合肯定夠了。

今天就給大家介紹如何配置英文數字組合驗證碼。首先我們看效果圖:

 

配置比較簡單,首先在JSP介面引入驗證碼

<div class="form-group">

<label for="yanzheng" class="col-sm-2 control-label">驗證碼</label>

<div class="col-sm-6">

  <input name="inputCode" value=""/>  

  <img border="0" src="${pageContext.request.contextPath }/checkCode" />

     <input type="button" value="換一張" onclick="history.go(0) "/>

</div>

</div>

然後引入工具類CheckCode


public class CheckCodeServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws                    ServletException, IOException {

doPost(request,response);

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws                             ServletException, IOException {

   response.setContentType("image/jpeg");

   HttpSession session = request.getSession();

   int width = 60;

   int height = 20;

   //設定瀏覽器不要快取此圖片

   response.setHeader("Pragma", "No-cache");

   response.setHeader("Cache-Control", "no-cache");

   response.setDateHeader("Expires", 0);

   //建立記憶體影象並獲得其圖形上下文

   BufferedImage image = new BufferedImage(width,                                   height,BufferedImage.TYPE_INT_RGB);

   Graphics g = image.getGraphics();

    // 產生隨機驗證碼

    //定義驗證碼的字元表

   String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

   char[] rands = new char[4];

   for(int i = 0; i < 4; i++) {

      int rand = (int) (Math.random() * 36);

      rands[i] = chars.charAt(rand);

   }

    // 產生影象

   //畫背景

   g.setColor(new Color(0xDCDCDC));

   g.fillRect(0, 0, width, height);

   //隨機產生120個干擾點

   for(int i = 0; i < 120; i++) {

      int x = (int)(Math.random() * width);

      int y = (int)(Math.random() * height);

      int red = (int)(Math.random() * 255);

      int green = (int)(Math.random() * 255);

      int blue = (int)(Math.random() * 255);

      g.setColor(new Color(red, green, blue));

      g.drawOval(x, y, 1, 0);

   }

   g.setColor(Color.BLACK);

   g.setFont(new Font(null, Font.ITALIC|Font.BOLD, 18));

   //在不同的高度上輸出驗證碼的不同字元

   g.drawString("" + rands[0], 1, 17);

   g.drawString("" + rands[1], 16, 15);

   g.drawString("" + rands[2], 31, 18);

   g.drawString("" + rands[3], 46, 16);

   g.dispose();

   //將影象輸出到客戶端

   ServletOutputStream sos = response.getOutputStream();

   ByteArrayOutputStream baos = new ByteArrayOutputStream();

   ImageIO.write(image, "JPEG", baos);

   byte[] buffer = baos.toByteArray();

   response.setContentLength(buffer.length);

   sos.write(buffer);

   baos.close();

   sos.close();

   //將驗證碼放到 session 中

   session.setAttribute("checkCode", new String(rands));

}

}

 驗證碼放到session中後,在Controller中獲取session,然後與前臺輸入對比


 String sc=(String)session.getAttribute("checkCode");

 if(sc.equals(inputCode)){

   //對比驗證碼即可

 }

以上就是驗證碼的全部程式碼實現。如果你有任何問題,歡迎留言,我們共同交流討論。

還可以微信關注和置頂我的公眾號“SL社群”(slshequ),獲取原始碼資源及眾多專案案例。