常用工具类之使用kaptcha生成验证码

验证码的作用

防止恶意破解密码、刷票、论坛灌水、刷页。

有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录尝试,实际上使用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,百度社区),我们利用比较简易的方式实现了这个功能。虽然登录麻烦一点,但是对网友的密码安全来说这个功能还是很有必要,也很重要。但我们还是 提醒大家要保护好自己的密码 ,尽量使用混杂了数字、字母、符号在内的 6 位以上密码,不要使用诸如 1234 之类的简单密码或者与用户名相同、类似的密码 ,免得你的账号被人盗用给自己带来不必要的麻烦。

验证码通常使用一些线条和一些不规则的字符组成,主要作用是为了防止一些黑客把密码数据化盗取。

Kaptcha 简介

Kaptcha 是一个可高度配置的实用验证码生成工具,可自由配置的选项如:

  • 验证码的字体
  • 验证码字体的大小
  • 验证码字体的字体颜色
  • 验证码内容的范围(数字,字母,中文汉字!)
  • 验证码图片的大小,边框,边框粗细,边框颜色
  • 验证码的干扰线
  • 验证码的样式(鱼眼样式、3D、普通模糊、…)

springboot整合kaptcha

1.登录验证码

使用kaptcha来实现

pom.xml

&#xA0; <dependency>
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; <groupid>com.github.axet</groupid>
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; <artifactid>kaptcha</artifactid>
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; <version>0.0.9</version>
&#xA0; &#xA0; &#xA0; &#xA0; </dependency>

config添加配置

import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
&#xA0;
import java.util.Properties;
&#xA0;
/*
* &#x9A8C;&#x8BC1;&#x7801;&#x914D;&#x7F6E;
* */
@Configuration
public class KaptchaConfig {
&#xA0;
&#xA0; &#xA0; @Bean
&#xA0; &#xA0; public DefaultKaptcha producer(){
&#xA0; &#xA0; &#xA0; &#xA0; Properties properties = new Properties();
&#xA0; &#xA0; &#xA0; &#xA0; properties.put("kaptcha.border","no");
&#xA0; &#xA0; &#xA0; &#xA0; properties.put("kaptcha.textproducer.font.color","black");
&#xA0; &#xA0; &#xA0; &#xA0; properties.put("kaptcha.textproducer.char.space","5");
&#xA0; &#xA0; &#xA0; &#xA0; Config config = new Config(properties);
&#xA0; &#xA0; &#xA0; &#xA0; DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
&#xA0; &#xA0; &#xA0; &#xA0; defaultKaptcha.setConfig(config);
&#xA0; &#xA0; &#xA0; &#xA0; return defaultKaptcha;
&#xA0; &#xA0; }
}

controller生成

import com.google.code.kaptcha.Constants;
import com.google.code.kaptcha.Producer;
import org.apache.commons.math3.stat.descriptive.summary.Product;
import org.apache.poi.util.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
&#xA0;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;
&#xA0;
@RestController
public class SysLoginController {
&#xA0; &#xA0; @Autowired
&#xA0; &#xA0; private Producer producter;
&#xA0; &#xA0;@GetMapping("/captcha.jpg")
&#xA0; &#xA0; public void &#xA0;captcha(HttpServletResponse response, HttpServletRequest request)throws ServletException, IOException{
&#xA0; &#xA0; &#xA0; &#xA0;response.setHeader("Cache-Control","no-store,no-cache");
&#xA0; &#xA0; &#xA0; &#xA0;response.setContentType("image/jpeg");
&#xA0; &#xA0; &#xA0; &#xA0;//&#x751F;&#x6210;&#x6587;&#x5B57;&#x9A8C;&#x8BC1;&#x7801;
&#xA0; &#xA0; &#xA0; &#xA0;String text = producter.createText();
&#xA0; &#xA0; &#xA0; &#xA0;//&#x751F;&#x6210;&#x56FE;&#x7247;&#x9A8C;&#x8BC1;&#x7801;
&#xA0; &#xA0; &#xA0; &#xA0;BufferedImage image = producter.createImage(text);
&#xA0; &#xA0; &#xA0; &#xA0;//&#x4FDD;&#x5B58;&#x9A8C;&#x8BC1;&#x7801;&#x5230;session
&#xA0; &#xA0; &#xA0; &#xA0;request.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY,text);
&#xA0; &#xA0; &#xA0; &#xA0;ServletOutputStream out = response.getOutputStream();
&#xA0; &#xA0; &#xA0; &#xA0;ImageIO.write(image,"jpg",out);
&#xA0; &#xA0; &#xA0; &#xA0;IOUtils.closeQuietly(out);
&#xA0; &#xA0;}
}

或者使用penggle包下的kaptcha

pom文件中导入kaptcha依赖
新建springboot项目,并在其pom.xml中导入kaptcha依赖:

&#xA0; <dependency>
&#xA0; &#xA0; &#xA0; &#xA0; <groupid>com.github.penggle</groupid>
&#xA0; &#xA0; &#xA0; &#xA0; <artifactid>kaptcha</artifactid>
&#xA0; &#xA0; &#xA0; &#xA0; <version>2.3.2</version>
&#xA0;</dependency>

创建前端页面与跳转页面
前端页面index.html

<h2>kaptcha&#x9A8C;&#x8BC1;&#x7801;&#x9A8C;&#x8BC1;</h2>
&#xA0; <form action="/loginh" method="post">
&#xA0; &#xA0; &#xA0; <input type="text" name="verifyCode" placeholder="&#x8BF7;&#x8F93;&#x5165;&#x9A8C;&#x8BC1;&#x7801;" required="true">
&#xA0; &#xA0; &#xA0; <img alt="&#x5355;&#x51FB;&#x56FE;&#x7247;&#x5237;&#x65B0;&#xFF01;" class="pointer" src="/common/kaptcha"    onclick="this.src='/common/kaptcha?d='+new Date()*1">
&#xA0; &#xA0; &#xA0; 
&#xA0; &#xA0; &#xA0; <button type="submit" value="submit">&#x767B;&#x9646;</button>
&#xA0; </form>

跳转页面success.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
&#xA0; &#xA0; <meta charset="UTF-8">
&#xA0; &#xA0; <title>Title</title>
</head>
<body>
<h2>success</h2>
</body>
</html>

注入keptcha配置类
创建配置类KaptchaConfig.java

import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.util.Properties;

@Component
public class KaptchaConfig {

&#xA0; &#xA0; @Bean
&#xA0; &#xA0; public DefaultKaptcha getDefaultKaptcha(){
&#xA0; &#xA0; &#xA0; &#xA0; DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        //Properties&#x7C7B;
&#xA0; &#xA0; &#xA0; &#xA0; Properties properties = new Properties();
        // &#x56FE;&#x7247;&#x8FB9;&#x6846;
&#xA0; &#xA0; &#xA0; &#xA0; properties.put("kaptcha.border", "no");
&#xA0; &#xA0; &#xA0; &#xA0; / &#x8FB9;&#x6846;&#x989C;&#x8272;
        properties.put("kaptcha.border.color", "105,179,90");
        // &#x5B57;&#x4F53;&#x989C;&#x8272;
        properties.put("kaptcha.textproducer.font.color", "black");
&#xA0; &#xA0; &#xA0; &#xA0;  // &#x56FE;&#x7247;&#x5BBD;
        properties.put("kaptcha.image.width", "150");
&#xA0; &#xA0; &#xA0; &#xA0;  // &#x56FE;&#x7247;&#x9AD8;
        properties.put("kaptcha.image.height", "40");
&#xA0; &#xA0; &#xA0; &#xA0; // &#x5B57;&#x4F53;&#x5927;&#x5C0F;
        properties.put("kaptcha.textproducer.font.size", "30");
&#xA0; &#xA0; &#xA0; &#xA0; // session key
        properties.put("kaptcha.session.key", "verifyCode");
&#xA0; &#xA0; &#xA0; &#xA0; // &#x9A8C;&#x8BC1;&#x7801;&#x957F;&#x5EA6;
        properties.put("kaptcha.textproducer.char.space", "5");
     // &#x5B57;&#x4F53;
        properties.put("kaptcha.textproducer.font.names", "&#x5B8B;&#x4F53;,&#x6977;&#x4F53;,&#x5FAE;&#x8F6F;&#x96C5;&#x9ED1;");
        //&#x56FE;&#x7247;&#x5E72;&#x6270;
       properties.put("kaptcha.noise.impl","com.google.code.kaptcha.impl.DefaultNoise");
        //Kaptcha &#x4F7F;&#x7528;&#x4E0A;&#x8FF0;&#x914D;&#x7F6E;
&#xA0; &#xA0; &#xA0; &#xA0; Config config = new Config(properties);
&#xA0; &#xA0; &#xA0; &#xA0; defaultKaptcha.setConfig(config);
&#xA0; &#xA0; &#xA0; &#xA0; return defaultKaptcha;
&#xA0; &#xA0; }
}

1.3.2 创建后端控制类生成验证码
创建控制类CommonController类,一方面通过流的方式将随机生成的验证码图片信息发送到前端浏览器;另一方面将验证码中的验证信息写入session中,以方便后续的验证

import com.google.code.kaptcha.impl.DefaultKaptcha;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;

@Controller
public class CommonController {

&#xA0; &#xA0; @Autowired
&#xA0; &#xA0; private DefaultKaptcha captchaProducer;

&#xA0; &#xA0;  @GetMapping("/common/kaptcha")
  public void defaultKaptcha(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
    byte[] captchaOutputStream = null;
    ByteArrayOutputStream imgOutputStream = new ByteArrayOutputStream();
    try {
      //&#x751F;&#x4EA7;&#x9A8C;&#x8BC1;&#x7801;&#x5B57;&#x7B26;&#x4E32;&#x5E76;&#x4FDD;&#x5B58;&#x5230;session&#x4E2D;
      String verifyCode = captchaProducer.createText();
      HttpSession session = httpServletRequest.getSession();
      session.setAttribute("verifyCode", verifyCode);
      session.setMaxInactiveInterval(20);
    //&#x5355;&#x72EC;&#x5B9E;&#x73B0;&#x9A8C;&#x8BC1;&#x7801;60s&#x8FC7;&#x671F;&#x529F;&#x80FD;
       stringRedisTemplate.opsForValue().set(&#x201C;mar:captcha:&#x201D;+session.getId(),capText,60, TimeUnit.SECONDS);

      BufferedImage challenge = captchaProducer.createImage(verifyCode);
      ImageIO.write(challenge, "jpg", imgOutputStream);
    } catch (IllegalArgumentException e) {
      httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
      return;
    }
    captchaOutputStream = imgOutputStream.toByteArray();
    httpServletResponse.setHeader("Cache-Control", "no-store");
    httpServletResponse.setHeader("Pragma", "no-cache");
    httpServletResponse.setDateHeader("Expires", 0);
    httpServletResponse.setContentType("image/jpeg");
    ServletOutputStream responseOutputStream = httpServletResponse.getOutputStream();
    responseOutputStream.write(captchaOutputStream);
    responseOutputStream.flush();
    responseOutputStream.close();
  }
}

实现验证码的验证与页面跳转
对前端输入的数据并发送到服务器的验证信息进行校验,当输入信息与验证码信息一致则跳转至success.html页面,否则跳转至false.html页面

@Controller
public class AdminController {

&#xA0; &#xA0; @PostMapping("/loginh")
&#xA0; &#xA0; public String loginByKaptcha(@RequestParam("verifyCode") String verifyCode,
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; HttpSession session){
&#xA0; &#xA0; &#xA0; &#xA0; String kaptchaCode = session.getAttribute("verifyCode") + "";
        String sessionYzm = stringRedisTemplate.opsForValue().get(mar:captcha:" + request.getSession().getId());
            if (sessionYzm==null){
                //&#x8FD4;&#x56DE;&#x7ED9;&#x524D;&#x7AEF;
                return "&#x9A8C;&#x8BC1;&#x7801;&#x5DF2;&#x8FC7;&#x671F;&#xFF0C;&#x8BF7;&#x91CD;&#x65B0;&#x8F93;&#x5165;&#xFF01;";
            }

&#xA0; &#xA0; &#xA0; &#xA0; if(verifyCode.equals(kaptchaCode)){
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; return "success";
&#xA0; &#xA0; &#xA0; &#xA0; }

&#xA0; &#xA0; &#xA0; &#xA0; return "false";
&#xA0; &#xA0; }
}

Original: https://blog.csdn.net/weixin_53998054/article/details/127809345
Author: 我是一个小仓鼠01
Title: 常用工具类之使用kaptcha生成验证码

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/657511/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球