<返回更多

Java生成随机图片验证码

2019-12-11    
加入收藏

今天跟大佬学了JAVA随机生成验证码,

开心Ing,,,,,

激动ing,,,

 

Java生成随机图片验证码

 

前台html代码

 <div style="margin-top: 50px;">
 <span>验证码:</span><input type="text" name="verifyCode" id="verifyCode" style="width: 75px;height: 25px;"/>
 <img id="verifyCodeImg" alt="点击更换" src="/qos/dog/getVerifyCodeImg"
 title="点击更换" onclick="change()">
 </div>

前台js代码

 function change() {
 var verifyCode = document.getElementById("verifyCodeImg");
 verifyCode.src = "/qos/dog/getVerifyCodeImg?time=" + Math.random(1000);
 }

 

 

 
/*-*/

 
/qos/dog/ 这里的路径是需要换成自己的哦

 

验证代码,在controller里面新建一个util文件夹,然后放入VerifyCodeUtil.java

代码如下

package com.paladin.qos.util;

 
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;

 
public class VerifyCodeUtil {

 
 private static final Random random = new Random();
 private static final String[] fontNames = {"宋体", "华文楷体", "黑体", "Georgia", "微软雅黑", "楷体_GB2312"};

 
 public static String drawImage(ByteArrayOutputStream output) {
 String code = "";
 int width = 50;
 int height = 25;

 
 //创建图片缓冲区
 BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);

 
 Graphics2D g = bi.createGraphics();

 
 //设置背景颜色
 g.setBackground(new Color(255, 255, 255));
 g.clearRect(0, 0, width, height);

 
 StringBuilder stringBuilder = new StringBuilder();
 //这里只画入四个字符
 for (int i = 0; i < 4; i++) {
 String s = randomChar() + ""; //随机生成字符,因为只有画字符串的方法,没有画字符的方法,所以需要将字符变成字符串再画
 stringBuilder.Append(s); //添加到StringBuilder里面
 float x = i * 1.0F * width / 4; //定义字符的x坐标
 g.setFont(randomFont()); //设置字体,随机
 g.setColor(randomColor()); //设置颜色,随机
 g.drawString(s, x, height - 5);
 }
 code = stringBuilder.toString();//获取验证码字符串

 
 //定义干扰线
 //定义干扰线的数量(3-5条)int num = random.nextInt(max)%(max-min+1) + min;
 int num = random.nextInt(5) % 3 + 3;
 Graphics2D graphics = (Graphics2D) bi.getGraphics();
 for (int i = 0; i < num; i++) {
 int x1 = random.nextInt(width);
 int y1 = random.nextInt(height);
 int x2 = random.nextInt(width);
 int y2 = random.nextInt(height);
 graphics.setColor(randomColor());
 graphics.drawLine(x1, y1, x2, y2);
 }
 // 释放图形上下文
 g.dispose();
 try {
 ImageIO.write(bi, "jpg", output);
 } catch (IOException e) {
 e.printStackTrace();
 }
 return code;//为了方便取值,直接返回code,

 

 

 
 }

 
 //随机字体
 private static Font randomFont() {
 int index = random.nextInt(fontNames.length);
 String fontName = fontNames[index];
 int style = random.nextInt(4); //随机获取4种字体的样式
 int size = random.nextInt(20) % 6 + 15; //随机获取字体的大小(10-20之间的值)
 return new Font(fontName, style, size);
 }

 
 //随机颜色
 private static Color randomColor() {
 int r = random.nextInt(225);
 int g = random.nextInt(225);
 int b = random.nextInt(225);
 return new Color(r, g, b);
 }

 

 
 //随机字符
 private static char randomChar() {
 //A-Z,a-z,0-9,可剔除一些难辨认的字母与数字
 String str = "0123456789ABCdefghiDEFGHIJopPQRVWXYZabcjklSTUmnqrstKLMNOvuwxyz";

 
 return str.charAt(random.nextInt(str.length()));
 }

 
}

最后,在controller里面引用

 @RequestMapping("/getVerifyCodeImg")
 @ResponseBody
 public void getVerifyCodeImg(HttpServletResponse response, HttpSession session) {
 ByteArrayOutputStream output = new ByteArrayOutputStream();
 String code = VerifyCodeUtil.drawImage(output);
 //将验证码文本直接存放到session中
 session.setAttribute("verifyCode", code);
 try {
 ServletOutputStream out = response.getOutputStream();
 output.writeTo(out);
 } catch (IOException e) {
 e.printStackTrace();
 }
 }

 

————————————————

版权声明:本文为CSDN博主「小仙女de成长」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_32963841/article/details/103182827

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>