验证码源代码
参考博客:https://blog.csdn.net/qq_42262675/article/details/80719594
@RequestMapping(value="graphCode",method = RequestMethod.GET)
@ResponseBody
public Map<String, String> graphCode(HttpServletResponse response){
//服务器通知浏览器不要缓存
response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
response.setHeader("expires", "0");
//在内存中创建一个长80,宽30的图片,默认黑色背景
//参数一:长
//参数二:宽
//参数三:颜色
int width = 80;
int height = 30;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//获取画笔
Graphics g = image.getGraphics();
//设置画笔颜色为灰色 背景色
g.setColor(Color.lightGray);
//填充图片
g.fillRect(0, 0, width, height);
//产生4个随机验证码,12Ey
String checkCode = getCheckCode();
//将验证码放入redis中
redisService.set("GRAPH_CODE",checkCode,120L);
//设置画笔颜色为黑色 code颜色
g.setColor(Color.black);
//设置字体的小大
g.setFont(new Font("宋体", Font.BOLD, 20));
//向图片上写入验证码
g.drawString(checkCode, 18, 22);
//画干扰线
drawLine(image);
//将内存中的图片输出到浏览器
//参数一:图片对象
//参数二:图片的格式,如PNG,JPG,GIF
//参数三:图片输出到哪里去
Map<String,String> map = new HashMap<>(2);
try {
ImageIO.write(image, "PNG", response.getOutputStream());
} catch (IOException e) {
map.put("state","999");
map.put("msg","服务器异常");
}
return map;
}
/**
* 产生4位随机字符串
*/
private String getCheckCode() {
String base = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
int size = base.length();
Random r = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 1; i <= 4; i++) {
//产生0到size-1的随机值
int index = r.nextInt(size);
//在base字符串中获取下标为index的字符
char c = base.charAt(index);
//将c放入到StringBuffer中去
sb.append(c);
}
return sb.toString();
}
/**
* 画干扰线
* @param image
*/
private void drawLine(BufferedImage image) {
Graphics2D g2 = (Graphics2D) image.getGraphics();
g2.setStroke(new BasicStroke(1.5F));
//干扰线是黑色
g2.setColor(Color.BLACK);
//画线
g2.drawLine(15, 18, 60, 18);
}
结语:前端显示图片验证码并能点击图片重新请求方法;
<input type="Captcha" class="Captcha" name="vcode" placeholder="请输入验证码!">
< img width="100px" height="50px" src="http://127.0.0.1:8080/register/graphCode" onclick='src="http://127.0.0.1:8080/register/graphCode?"+new Date()'>