1. 程式人生 > >JAVA生成隨機驗證碼

JAVA生成隨機驗證碼

一、生成隨機圖片的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>

四、效果圖