短視訊商城系統,通過Java實現圖片驗證碼,點選重新整理圖片驗證碼

zhibo系統開發發表於2022-07-01

短視訊商城系統,通過Java實現圖片驗證碼,點選重新整理圖片驗證碼

建立生成圖片驗證碼的工具類:

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
/**
 * 驗證碼生成器
 * 
 */
public class SCaptcha {
    // 圖片的寬度。
    private int width = 120;
    // 圖片的高度。
    private int height = 40;
    // 驗證碼字元個數
    private int codeCount = 4;
    // 驗證碼干擾線數
    private int lineCount = 50;
    // 驗證碼
    private String code = null;
    // 驗證碼圖片Buffer
    private BufferedImage buffImg = null;
// 隨即的字元陣列
    private char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'M', 'N', 'P', 'Q', 'R',
            'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7', '8', '9' };
    // 生成隨機數
    private Random random = new Random();
    public SCaptcha() {
        this.createCode();
    }
    /**
     * 
     * @param width 圖片寬
     * @param height 圖片高
     */
    public SCaptcha(int width, int height) {
        this.width = width;
        this.height = height;
        this.createCode();
    }
    /**
     * 
     * @param width 圖片寬
     * @param height 圖片高
     * @param codeCount 字元個數
     * @param lineCount 干擾線條數
     */
    public SCaptcha(int width, int height, int codeCount, int lineCount) {
        this.width = width;
        this.height = height;
        this.codeCount = codeCount;
        this.lineCount = lineCount;
        this.createCode();
    }
    public void createCode() {
        int codeX = 0;
        int fontHeight = 0;
        fontHeight = height - 5;// 字型的高度
        codeX = width / (codeCount + 3);// 每個字元的寬度
        // 影像buffer
        buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = buffImg.createGraphics();
        // 將影像填充為白色
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, width, height);
        // 建立字型
        ImgFontByte imgFont = new ImgFontByte();
        Font font = imgFont.getFont(fontHeight);
        g.setFont(font);
        StringBuffer randomCode = new StringBuffer();
        // 隨機產生驗證碼字元
        for (int i = 0; i < codeCount; i++) {
            String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);
            // 設定字型顏色
            g.setColor(getRandomColor());
            // 設定字型位置
            g.drawString(strRand, (i + 1) * codeX, getRandomNumber(height / 2) + 25);
            randomCode.append(strRand);
        }
        code = randomCode.toString();
    }
    /** 獲取隨機顏色 */
    private Color getRandomColor() {
        int r = getRandomNumber(255);
        int g = getRandomNumber(255);
        int b = getRandomNumber(255);
        return new Color(r, g, b);
    }
    /** 獲取隨機數 */
    private int getRandomNumber(int number) {
        return random.nextInt(number);
    }
    public void write(String path) throws IOException {
        OutputStream sos = new FileOutputStream(path);
        this.write(sos);
    }
    public void write(OutputStream sos) throws IOException {
        ImageIO.write(buffImg, "png", sos);
        sos.close();
    }
    public BufferedImage getBuffImg() {
        return buffImg;
    }
    public String getCode() {
        return code;
    }
    /** 字型樣式類 */
    class ImgFontByte {
        public Font getFont(int fontHeight) {
            try {
                Font baseFont = Font.createFont(Font.HANGING_BASELINE, new ByteArrayInputStream(
                        hex2byte(getFontByteStr())));
                return baseFont.deriveFont(Font.PLAIN, fontHeight);
            } catch (Exception e) {
                return new Font("Arial", Font.PLAIN, fontHeight);
            }
        }
        private byte[] hex2byte(String str) {
            if (str == null)
                return null;
            str = str.trim();
            int len = str.length();
            if (len == 0 || len % 2 == 1)
                return null;
            byte[] b = new byte[len / 2];
            try {
                for (int i = 0; i < str.length(); i += 2) {
                    b[i / 2] = (byte) Integer.decode("0x" + str.substring(i, i + 2)).intValue();
                }
                return b;
            } catch (Exception e) {
                return null;
            }
        }
        // 字型檔案的十六進位制字串
        private String getFontByteStr() {
            //防止報字串長度過長錯誤,改為從配置檔案讀取
            return ReadFontByteProperties.getFontByteStr();
        }
    }
}


controller層程式碼:

// 設定響應的型別格式為圖片格式
        response.setContentType("image/jpeg");
        // 禁止影像快取。
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        //例項生成驗證碼物件
        SCaptcha instance = new SCaptcha();
        //將驗證碼存入session
        request.getSession().setAttribute("verification", instance.getCode());
        //向頁面輸出驗證碼圖片
        instance.write(response.getOutputStream());


頁面程式碼:

<img id="vimg" src="${path }/login/verification"/>


以上就是短視訊商城系統,通過Java實現圖片驗證碼,點選重新整理圖片驗證碼, 更多內容歡迎關注之後的文章


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69978258/viewspace-2903828/,如需轉載,請註明出處,否則將追究法律責任。

相關文章