Java製作驗證碼的完整程式碼

不會禿頭的猿發表於2020-11-04

JAVA程式碼製作驗證碼,可用於註冊等功能頁面

要匯入servlet-api.jar包

建立驗證碼的Util工具類:

先建立圖片並生成隨機的驗證碼字母
在這裡插入圖片描述
設定圖片的底色,並用setFont函式將驗證碼畫在圖片上,如果想讓驗證碼難一點,可以新增for迴圈的程式碼給圖片增加旋轉角度
在這裡插入圖片描述

給驗證碼增加干擾線,提高安全性
在這裡插入圖片描述
設定邊框

在這裡插入圖片描述

建立VerifyPic的servlet,通過Util類獲取程式碼,並存入session中,然後輸送去前端頁面

實打
前端頁面驗證碼如下:
在這裡插入圖片描述

完整Util工具類程式碼如下:

package com.sport.util;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;

public class VerifyUtil {
    public static Map<String, Object> generateVerify(){
        //建立一張圖片
        BufferedImage verifyPic = new BufferedImage(120,40,BufferedImage.TYPE_3BYTE_BGR);
        //通過圖片獲取畫筆
        Graphics2D g = verifyPic.createGraphics();
        //準備一個字母+數字的字典
        String letters = "23456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        //規定驗證碼的位數
        int verifyLength = 4;
        //生成隨機驗證碼
        String verifyCode = "";
        //迴圈取值
        for(int i=0; i<verifyLength; i++) {
            verifyCode +=letters.charAt((int)(Math.random()*letters.length()));
        }
        //將圖片的底板由黑變白
        g.setColor(Color.white);
        g.fillRect(0, 0, 120, 40);
        //將驗證碼畫在圖片之上
        g.setFont(new Font("微軟雅黑",Font.BOLD, 24));
        for (int i = 0; i < verifyLength; i++) {
            //隨機產生一個角度
            double theta = Math.random() * Math.PI / 4 * ((int)(Math.random()*2) == 0?1:-1);
            //產生偏轉
            g.rotate(theta, 24+i*22, 20);
            //每畫一個字幕之前都隨機給一個顏色
            g.setColor(new Color((int)(Math.random()*256), (int)(Math.random()*256), (int)(Math.random()*256)));
            g.drawString(verifyCode.charAt(i)+"", 20+i*22 , 26);
            //回正
            g.rotate(-theta, 24+i*22, 20);
        }
        //加入干擾線
        for (int i = 0; i < 5; i++) {
            //給隨機顏色
            g.setColor(new Color((int)(Math.random()*256), (int)(Math.random()*256), (int)(Math.random()*256)));
            //畫線
            g.drawLine((int)(Math.random()*120), (int)(Math.random()*40),
                    (int)(Math.random()*120), (int)(Math.random()*40));
        }
        //設定邊框顏色
        g.setColor(Color.black);
        //給驗證碼一個外邊框
        g.drawRect(0, 0, 118, 38);

        //將驗證碼和圖片一起存入map
        Map<String, Object> data = new HashMap<String, Object>();
        data.put("verifyCode", verifyCode);
        data.put("verifyPic", verifyPic);

        return data;
    }
}

完整VerifyPic的程式碼如下:

package com.sport.servlet;

import com.sport.util.VerifyUtil;

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 javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Map;

@WebServlet("/VerifyPic")
public class VerifyPic extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        Map<String, Object> data = VerifyUtil.generateVerify();
        //獲取驗證碼
        String verifyCode = (String) data.get("verifyCode");
        //將驗證碼存入session
        HttpSession session = request.getSession();
        session.setAttribute("verifyCode", verifyCode);
        //獲取圖片
        BufferedImage verifyPic = (BufferedImage) data.get("verifyPic");
        //輸出圖片給前端,使用工具類ImageIO
        ImageIO.write(verifyPic, "jpg", response.getOutputStream());

    }

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

相關文章