短视频商城系统,通过Java实现图片验证码,点击刷新图片验证码

短视频商城系统,通过Java实现图片验证码,点击刷新图片验证码

创建生成图片验证码的工具类:

 

1
<br>import javax.imageio.ImageIO;<br>import java.awt.*;<br>import java.awt.image.BufferedImage;<br>import java.io.ByteArrayInputStream;<br>import java.io.FileOutputStream;<br>import java.io.IOException;<br>import java.io.OutputStream;<br>import java.util.Random;<br>/**<br> * 验证码生成器<br> * <br> */<br>public class SCaptcha {<br>    // 图片的宽度。<br>    private int width = 120;<br>    // 图片的高度。<br>    private int height = 40;<br>    // 验证码字符个数<br>    private int codeCount = 4;<br>    // 验证码干扰线数<br>    private int lineCount = 50;<br>    // 验证码<br>    private String code = null;<br>    // 验证码图片Buffer<br>    private BufferedImage buffImg = null;<br>// 随即的字符数组<br>    private char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'M', 'N', 'P', 'Q', 'R',<br>            'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7', '8', '9' };<br>    // 生成随机数<br>    private Random random = new Random();<br>    public SCaptcha() {<br>        this.createCode();<br>    }<br>    /**<br>     * <br>     * @param width 图片宽<br>     * @param height 图片高<br>     */<br>    public SCaptcha(int width, int height) {<br>        this.width = width;<br>        this.height = height;<br>        this.createCode();<br>    }<br>    /**<br>     * <br>     * @param width 图片宽<br>     * @param height 图片高<br>     * @param codeCount 字符个数<br>     * @param lineCount 干扰线条数<br>     */<br>    public SCaptcha(int width, int height, int codeCount, int lineCount) {<br>        this.width = width;<br>        this.height = height;<br>        this.codeCount = codeCount;<br>        this.lineCount = lineCount;<br>        this.createCode();<br>    }<br>    public void createCode() {<br>        int codeX = 0;<br>        int fontHeight = 0;<br>        fontHeight = height - 5;// 字体的高度<br>        codeX = width / (codeCount + 3);// 每个字符的宽度<br>        // 图像buffer<br>        buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);<br>        Graphics2D g = buffImg.createGraphics();<br>        // 将图像填充为白色<br>        g.setColor(Color.WHITE);<br>        g.fillRect(0, 0, width, height);<br>        // 创建字体<br>        ImgFontByte imgFont = new ImgFontByte();<br>        Font font = imgFont.getFont(fontHeight);<br>        g.setFont(font);<br>        StringBuffer randomCode = new StringBuffer();<br>        // 随机产生验证码字符<br>        for (int i = 0; i < codeCount; i++) {<br>            String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);<br>            // 设置字体颜色<br>            g.setColor(getRandomColor());<br>            // 设置字体位置<br>            g.drawString(strRand, (i + 1) * codeX, getRandomNumber(height / 2) + 25);<br>            randomCode.append(strRand);<br>        }<br>        code = randomCode.toString();<br>    }<br>    /** 获取随机颜色 */<br>    private Color getRandomColor() {<br>        int r = getRandomNumber(255);<br>        int g = getRandomNumber(255);<br>        int b = getRandomNumber(255);<br>        return new Color(r, g, b);<br>    }<br>    /** 获取随机数 */<br>    private int getRandomNumber(int number) {<br>        return random.nextInt(number);<br>    }<br>    public void write(String path) throws IOException {<br>        OutputStream sos = new FileOutputStream(path);<br>        this.write(sos);<br>    }<br>    public void write(OutputStream sos) throws IOException {<br>        ImageIO.write(buffImg, "png", sos);<br>        sos.close();<br>    }<br>    public BufferedImage getBuffImg() {<br>        return buffImg;<br>    }<br>    public String getCode() {<br>        return code;<br>    }<br>    /** 字体样式类 */<br>    class ImgFontByte {<br>        public Font getFont(int fontHeight) {<br>            try {<br>                Font baseFont = Font.createFont(Font.HANGING_BASELINE, new ByteArrayInputStream(<br>                        hex2byte(getFontByteStr())));<br>                return baseFont.deriveFont(Font.PLAIN, fontHeight);<br>            } catch (Exception e) {<br>                return new Font("Arial", Font.PLAIN, fontHeight);<br>            }<br>        }<br>        private byte[] hex2byte(String str) {<br>            if (str == null)<br>                return null;<br>            str = str.trim();<br>            int len = str.length();<br>            if (len == 0 || len % 2 == 1)<br>                return null;<br>            byte[] b = new byte[len / 2];<br>            try {<br>                for (int i = 0; i < str.length(); i += 2) {<br>                    b[i / 2] = (byte) Integer.decode("0x" + str.substring(i, i + 2)).intValue();<br>                }<br>                return b;<br>            } catch (Exception e) {<br>                return null;<br>            }<br>        }<br>        // 字体文件的十六进制字符串<br>        private String getFontByteStr() {<br>            //防止报字符串长度过长错误,改为从配置文件读取<br>            return ReadFontByteProperties.getFontByteStr();<br>        }<br>    }<br>}

controller层代码:

 

1
<br>// 设置响应的类型格式为图片格式<br>        response.setContentType("image/jpeg");<br>        // 禁止图像缓存。<br>        response.setHeader("Pragma", "no-cache");<br>        response.setHeader("Cache-Control", "no-cache");<br>        response.setDateHeader("Expires", 0);<br>        //实例生成验证码对象<br>        SCaptcha instance = new SCaptcha();<br>        //将验证码存入session<br>        request.getSession().setAttribute("verification", instance.getCode());<br>        //向页面输出验证码图片<br>        instance.write(response.getOutputStream());

 

页面代码:

 

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

 

以上就是短视频商城系统,通过Java实现图片验证码,点击刷新图片验证码, 更多内容欢迎关注之后的文章

 

posted @   云豹科技-苏凌霄  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示