SpringBoot实现前端验证码图片生成和校验

SpringBoot下实现前端验证码图片的生成和校验,供大家参考,具体内容如下

1.效果

点击验证码可以获取新的验证码

2.原理

后台生成验证码图片,将图片传到前台。
后台在session中保存验证码内容。
前台输入验证码后传到后台在后台取出session中保存的验证码进行校验。

注意,验证码的明文是不能传送到前端的。前端内容都是透明的,不安全。验证码是用来防机器人并不是单单防人。如果把验证码明文传到前端很容易就会被破解。

3.图片生成

验证码生成工具类RandomValidateCodeUtil

public class RandomValidateCodeUtil {

 public static final String RANDOMCODEKEY= "RANDOMVALIDATECODEKEY";//放到session中的key
 private String randString = "0123456789";//随机产生只有数字的字符串 private String
 //private String randString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生只有字母的字符串
 //private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生数字与字母组合的字符串
 private int width = 95;// 图片宽
 private int height = 25;// 图片高
 private int lineSize = 40;// 干扰线数量
 private int stringNum = 4;// 随机产生字符数量

 private static final Logger logger = LoggerFactory.getLogger(RandomValidateCodeUtil.class);

 private Random random = new Random();

 /**
  * 获得字体
  */
 private Font getFont() {
  return new Font("Fixedsys", Font.CENTER_BASELINE, 18);
 }

 /**
  * 获得颜色
  */
 private Color getRandColor(int fc, int bc) {
  if (fc > 255)
   fc = 255;
  if (bc > 255)
   bc = 255;
  int r = fc + random.nextInt(bc - fc - 16);
  int g = fc + random.nextInt(bc - fc - 14);
  int b = fc + random.nextInt(bc - fc - 18);
  return new Color(r, g, b);
 }

 /**
  * 生成随机图片
  */
 public void getRandcode(HttpServletRequest request, HttpServletResponse response) {
  HttpSession session = request.getSession();
  // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
  BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
  Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
  g.fillRect(0, 0, width, height);//图片大小
  g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));//字体大小
  g.setColor(getRandColor(110, 133));//字体颜色
  // 绘制干扰线
  for (int i = 0; i <= lineSize; i++) {
   drowLine(g);
  }
  // 绘制随机字符
  String randomString = "";
  for (int i = 1; i <= stringNum; i++) {
   randomString = drowString(g, randomString, i);
  }
  logger.info(randomString);
  //将生成的随机字符串保存到session中
  session.removeAttribute(RANDOMCODEKEY);
  session.setAttribute(RANDOMCODEKEY, randomString);
  g.dispose();
  try {
   // 将内存中的图片通过流动形式输出到客户端
   ImageIO.write(image, "JPEG", response.getOutputStream());
  } catch (Exception e) {
   logger.error("将内存中的图片通过流动形式输出到客户端失败>>>> ", e);
  }

 }

 /**
  * 绘制字符串
  */
 private String drowString(Graphics g, String randomString, int i) {
  g.setFont(getFont());
  g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
    .nextInt(121)));
  String rand = String.valueOf(getRandomString(random.nextInt(randString
    .length())));
  randomString += rand;
  g.translate(random.nextInt(3), random.nextInt(3));
  g.drawString(rand, 13 * i, 16);
  return randomString;
 }

 /**
  * 绘制干扰线
  */
 private void drowLine(Graphics g) {
  int x = random.nextInt(width);
  int y = random.nextInt(height);
  int xl = random.nextInt(13);
  int yl = random.nextInt(15);
  g.drawLine(x, y, x + xl, y + yl);
 }

 /**
  * 获取随机的字符
  */
 public String getRandomString(int num) {
  return String.valueOf(randString.charAt(num));
 }
}

在Controller调用生成验证码图片方法并将图片传到前端

/**
 * 生成验证码
 */
@RequestMapping(value = "/getVerify")
public void getVerify(HttpServletRequest request, HttpServletResponse response) {
 try {
  response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片
  response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容
  response.setHeader("Cache-Control", "no-cache");
  response.setDateHeader("Expire", 0);
  RandomValidateCodeUtil randomValidateCode = new RandomValidateCodeUtil();
  randomValidateCode.getRandcode(request, response);//输出验证码图片方法
 } catch (Exception e) {
  logger.error("获取验证码失败>>>> ", e);
 }
}

前端获取验证码图片

html

<div class="row">
 <div class="col-xs-6 pull_left">
  <div class="form-group">
   <input class="form-control" type="tel" id="verify_input" placeholder="请输入验证码" maxlength="4">
  </div>
 </div>
 <div class="col-xs-6 pull_left">
  <a href="javascript:void(0);" rel="external nofollow" title="点击更换验证码">
   <img id="imgVerify" src="" alt="更换验证码" height="36" width="100%" onclick="getVerify(this);">
  </a>
 </div>
</div>

js

//获取验证码
function getVerify(obj){
 obj.src = httpurl + "/sys/getVerify?"+Math.random();
}

每次点击图片重新刷新验证码
界面初次加载时,调用getVerify()方法即可。

4.验证码验证

前端获取用户输入的验证码,传到后台进行验证。
后台验证代码

/**
 * 忘记密码页面校验验证码
 */
@RequestMapping(value = "/checkVerify", method = RequestMethod.POST, headers = "Accept=application/json")
public boolean checkVerify(@RequestBody Map<String, Object> requestMap, HttpSession session) {
 try{
  //从session中获取随机数
  String inputStr = requestMap.get("inputStr").toString();
  String random = (String) session.getAttribute("RANDOMVALIDATECODEKEY");
  if (random == null) {
   return false;
  }
  if (random.equals(inputStr)) {
   return true;
  } else {
   return false;
  }
 }catch (Exception e){
  logger.error("验证码校验失败", e);
  return false;
 }
}

后台校验后,返给前端验证结果true或者false即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • springboot整合kaptcha验证码的示例代码

    前言: 关于kaptcha简介以及spring整合kaptcha,我在另一篇文章中已详细讲解,请参考:spring整合kaptcha验证码. 本文将介绍springboot整合kaptcha的两种方式. 开发工具及技术: 1.idea 2017 2.springboot 2.0.2 3.kaptcha 正式开始: 方式一:通过kaptcha.xml配置 1.用idea新建一个spring Initializr 2.添加kaptcha的依赖: <!-- kaptcha验证码 --> <de

  • Google Kaptcha 框架实现登录验证码功能(SSM 和 SpringBoot)

    一.效果图: 二.导入 jar 包 1.由于这是大神写好封装起来的一个框架,所有我们使用前得先下载相关的 jar 包 第一种:maven <!-- 验证码 --> <!-- https://mvnrepository.com/artifact/com.github.penggle/kaptcha --> <dependency>     <groupId>com.github.penggle</groupId>     <artifactI

  • springMVC实现图形验证码(kaptcha)代码实例

    springMVC项目中实现图形验证码功能,可以使用kaptcha来实现,下面是步骤 一.引入架包,pom.xml <dependency> <groupId>com.google.code</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency> 二.kaptchaProducer配置,需要在spring

  • SpringMvc使用GoogleKaptcha生成验证码

    前言:google captcha 是google生成验证码的一个工具类,其原理是将随机生成字符串保存到session中,同时以图片的形式返回给页面,之后前台页面提交到后台进行对比. 1.jar包准备 官方提供的pom应该是 <dependency> <groupId>com.google.code.kaptcha</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2<

  • SpringBoot集成kaptcha验证码

    本文实例为大家分享了SpringBoot集成kaptcha验证码的具体代码,供大家参考,具体内容如下 1.kaptcha相关介绍 Kaptcha是一个基于SimpleCaptcha的验证码开源项目. 2.集成方案 ①pom.xml中配置依赖 <!-- 验证码--> <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> &l

  • SpringBoot 集成Kaptcha实现验证码功能实例详解

    在一个web应用中验证码是一个常见的元素.不管是防止机器人还是爬虫都有一定的作用,我们是自己编写生产验证码的工具类,也可以使用一些比较方便的验证码工具.在网上收集一些资料之后,今天给大家介绍一下kaptcha的和springboot一起使用的简单例子. 准备工作: 1.你要有一个springboot的hello world的工程,并能正常运行. 2.导入kaptcha的maven: <!-- https://mvnrepository.com/artifact/com.github.penggl

  • 登陆验证码kaptcha结合spring boot的用法详解

    前言 在我们用户登录的时候,为了安全性考虑,会增加验证码的功能,这里采用的是google的kaptcha:spirngboot是轻便,独立,使得基于spring的应用开发变得特别简单.网上有很多介绍springboot的介绍,这里不多说. 言归正抓,讲下登陆时验证码结合springboot的用法 引入kaptcha所需要的jar包,我这里用的是maven <dependency> <groupId>com.github.penggle</groupId> <art

  • SpringBoot实现前端验证码图片生成和校验

    SpringBoot下实现前端验证码图片的生成和校验,供大家参考,具体内容如下 1.效果 点击验证码可以获取新的验证码 2.原理 后台生成验证码图片,将图片传到前台. 后台在session中保存验证码内容. 前台输入验证码后传到后台在后台取出session中保存的验证码进行校验. 注意,验证码的明文是不能传送到前端的.前端内容都是透明的,不安全.验证码是用来防机器人并不是单单防人.如果把验证码明文传到前端很容易就会被破解. 3.图片生成 验证码生成工具类RandomValidateCodeUti

  • SpringBoot 图形验证码的生成和校验

    1. 编写工具类 package com.cn.beauty.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSes

  • asp.net验证码图片生成示例

    验证码是一张图片.我们需要在前台代码中写一段<img>,src指向一张页面(ValidateImage.aspx). 复制代码 代码如下: <script language="javascript"> function changeImg() {            $("#imgCheckNo").attr("src", "ValidateImage.aspx?r=" + getRandom(999

  • Java验证码图片生成代码

    Java生成验证码图片的具体代码,供大家参考,具体内容如下 1.首先新建一各专门生成验证码图片的类VerifyCode: public class VerifyCode { private int w=70; private int h=35; private Random r=new Random(); //宋体,华文楷书,黑体,华文新魏,华文隶书,微软雅黑,楷体_GB2312,Times New Roman private String [] fontNames={"宋体",&qu

  • java实现随机验证码图片生成

    本文实例为大家分享了java生成随机验证码图片的具体代码,供大家参考,具体内容如下 1.controller /** * 获取随机数验证码图片 * * @param request HttpServletRequest * @param response HttpServletResponse */ @GetMapping(value = "/getRandomCode" ,produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) pub

  • J2EE验证码图片如何生成和点击刷新验证码

    验证码图片生成步骤 创建BufferedImage对象. 获取BufferedImage的画笔,即调用getGraphics()方法获取Graphics对象. 调用Graphics对象的setColor()方法和fillRect()方法设置图片背景颜色. 调用Graphics对象的setColor()方法和drawLine()方法设置图片干扰线. 调用BufferedImaged对象的setRGB()方法设置图片的噪点. 调用Graphics对象的setColor()方法.setFont()方法

  • SpringBoot实现Thymeleaf验证码生成

    使用后台返回验证码图片,验证码存到session中后端实现校验,前端只展示验证码图片. 本篇用SpringBoot Thymeleaf实现验证码生成. 创建springboot项目 引入依赖 完整pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http

  • springboot验证码的生成与验证的两种方法

    目录 前言 效果一览(单击图片刷新验证码) 一.使用整合kaptcha方式实现验证码生成与验证 二.使用hutool-captcha方式实现验证码生成与验证 前言 在springboot的登陆页面中为了防止机器大规模注册,机器暴力破解数据密码等危害,需要验证随机生成的验证码.现提出两种简易方案生成验证码功能,一种采用springboot整合kaptcha第三方验证码生成工具的生成方案:另一种采用springboot整合第三方类库hutool生成验证码,验证成功跳转至success页面,失败则跳转

  • python3 pillow生成简单验证码图片的示例

    使用Python的pillow模块 random 模块随机生成验证码图片,并应用到Django项目中 安装pillow $ pip3 install pillow 生成验证码图片 \vericode.py from PIL import Image,ImageDraw,ImageFont,ImageFilter import random #随机码 默认长度=1 def random_code(lenght=1): code = '' for char in range(lenght): cod

  • SpringBoot整合kaptcha实现图片验证码功能

    目录 栗子 配置文件 SpringBoot项目中pom.xml文件 项目代码 项目结构 SpringBootVerifyCodeApplication.java VerifyCodeConfig.java KaptchaController.java 测试 生成运算符验证码 1.设置字符个数为7 2.获取图片 3.演示一下 栗子 登录是所有系统都绕不开的一道坎,很多系统会在用户名和密码下发放置一个图形验证码,例如:  这些图形验证码看起来不仅很丑,而且模糊,但却是保护系统的第一道屏障,它的作用是

随机推荐