JAVA生成隨機驗證碼
阿新 • • 發佈:2018-12-20
一、生成隨機圖片的java工具類
package com.xh.commen; import java.awt.*; import java.awt.image.BufferedImage; public class ImageUtil { private static String code=""; //記錄下隨機字母或數字 /** * 獲取生成圖片驗證碼 * */ public static BufferedImage getImage(){ //每次都要清空code code=""; //新建一個150*50的畫布 BufferedImage bufferedImage = new BufferedImage(150,50,BufferedImage.TYPE_INT_RGB); //獲得畫筆 Graphics graphics = bufferedImage.getGraphics(); //設定顏色 graphics.setColor(new Color(210,210,210)); //填充一個從(0,0)【左上角】開始的矩形,顏色為之前設定的 graphics.fillRect(0,0,150,50); //在畫布上寫字 drowString(graphics); //在畫布上畫隨機花點 drowDian(graphics); //在畫布上畫隨機劃線 drowLine(graphics); //在畫布上畫隨機弧線 drowArc(graphics); return bufferedImage; } //產生隨機的4個字母或數字 public static void drowString(Graphics graphics){ graphics.setFont(new Font("楷體",Font.ITALIC,24)); String dbString ="1234567890qwertyuioplkjhgfdsazxcvbnm" + "QWERTYUIOPLKJHGFDSAZXCVBNM"; for(int i = 1; i <= 4 ;i++){ char s = dbString.charAt((int)(Math.random()*dbString.length()-1)); String s1 = String.valueOf(s); code = code+s1; //生成隨機的顏色 graphics.setColor(new Color((int)(Math.random()*200),(int)(Math.random()*200),(int)(Math.random()*200))); //設定字出現的位置,字元會上下跳,數字根據自己的情況定 graphics.drawString(s1,24*i,(int)(Math.random()*9+30)); } } //獲取產生的隨機字串 public static String getCodeString(){ return code; } //繪製8個隨機點,隨機位置根據自己的畫布大小定 public static void drowDian(Graphics graphics){ for(int i = 1; i<=8;i++){ graphics.fillOval((int)(Math.random()*145), (int)(Math.random()*47),(int)(Math.random()*6), (int)(Math.random()*6)); } } //繪製4條隨機線,隨機位置根據自己的畫布大小定 public static void drowLine(Graphics graphics){ for(int i = 1;i<=4;i++){ graphics.drawLine((int)(Math.random()*145), (int)(Math.random()*48),(int)(Math.random()*145), (int)(Math.random()*48)); } } //繪製4條隨機弧線,隨機位置根據自己的畫布大小定 public static void drowArc(Graphics graphics){ for(int i = 1;i<=4;i++){ graphics.drawArc((int)(Math.random()*148), (int)(Math.random()*46),(int)(Math.random()*145), (int)(Math.random()*47), (int)(Math.random()*190),(int)(Math.random()*190)); } } }
二、呼叫ImageUtil工具類的Servlet
程式碼
package com.xh.web; import com.xh.commen.ImageUtil; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.PrintWriter; @WebServlet(name = "ImgServlet",urlPatterns = {"/img","/code"}) public class ImgServlet extends HttpServlet { private String code; //做驗證 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲取發來的驗證碼 String co = request.getParameter("code"); PrintWriter out = response.getWriter(); if(co.equalsIgnoreCase(code)){ out.print(1); }else{ out.print(0); } } //向前端傳送驗證碼圖片 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲取圖片 BufferedImage image = ImageUtil.getImage(); //獲取生成的隨機字串 code = ImageUtil.getCodeString(); //設定response的格式 response.setContentType("image/jpeg"); //向網頁輸出圖片 ImageIO.write(image,"jpg",response.getOutputStream()); } }
三、前端HTML程式碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>驗證碼</title> <script src="../lib/jquery-3.2.1.min.js"></script> <script> $(function () { var i =0; $("img").click(function () { i++; $(this).attr("src","../img?"+i); }) $("input[name='code']").blur(function () { var code = $(this).val(); $.ajax({ url:"../code", type:"post", data:{"code":code}, dataType:"text", success:function (data) { if(data == 0){ $("span").css("color","red"); $("span").html("驗證碼錯誤"); }else{ $("span").html(""); } } }) }) }) </script> </head> <body> <label>驗證碼:</label><input type="text" name="code"><span></span> <br> <img src="../img"><i>看不清?點選圖片切換</i> </body> </html>
四、效果圖