短视频商城系统,通过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实现图片验证码,点击刷新图片验证码, 更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现