软件编程
位置:首页>> 软件编程>> java编程>> SpringBoot实现Thymeleaf验证码生成

SpringBoot实现Thymeleaf验证码生成

作者:将就吗  发布时间:2021-11-25 08:06:38 

标签:SpringBoot,验证码

使用后台返回验证码图片,验证码存到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://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>2.2.6.RELEASE</version>
       <relativePath/> <!-- lookup parent from repository -->
   </parent>
   <groupId>com.example</groupId>
   <artifactId>web</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>web</name>
   <description>Demo project for Spring Boot</description>

<properties>
       <java.version>1.8</java.version>
   </properties>

<dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>

<dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-test</artifactId>
           <scope>test</scope>
           <exclusions>
               <exclusion>
                   <groupId>org.junit.vintage</groupId>
                   <artifactId>junit-vintage-engine</artifactId>
               </exclusion>
           </exclusions>
       </dependency>

<!-- ThymeLeaf 依赖 -->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-thymeleaf</artifactId>
       </dependency>
   </dependencies>

<build>
       <plugins>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
           </plugin>
       </plugins>
   </build>

</project>

application.yml配置 Thymeleaf


#Thymeleaf配置
spring:
 mvc:
   static-path-pattern: /**
 thymeleaf:
   mode: HTML
   encoding: UTF-8
   #关闭缓存
   cache: false

创建CaptchaController.java 类


package com.example.web.controller;

import com.example.web.util.VerifyCode;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;

@RestController
public class CaptchaController {
   /* 获取验证码图片*/

@RequestMapping("/getVerifyCode")
   public void getVerificationCode(HttpServletResponse response, HttpServletRequest request) {
       try {
           int width = 200;
           int height = 69;

BufferedImage verifyImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//生成对应宽高的初始图片
           String randomText = VerifyCode.drawRandomText(width, height, verifyImg);//单独的一个类方法,出于代码复用考虑,进行了封装。功能是生成验证码字符并加上噪点,干扰线,返回值为验证码字符

request.getSession().setAttribute("verifyCode", randomText);
           response.setContentType("image/png");//必须设置响应内容类型为图片,否则前台不识别

OutputStream os = response.getOutputStream(); //获取文件输出流
           ImageIO.write(verifyImg, "png", os);//输出图片流
           os.flush();
           os.close();//关闭流
       } catch (IOException e) {
           e.printStackTrace();
       }
   }
}

创建VerifyCode.java 工具类


package com.example.web.util;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;

public class VerifyCode {

public static String drawRandomText(int width, int height, BufferedImage verifyImg) {

Graphics2D graphics = (Graphics2D) verifyImg.getGraphics();
       graphics.setColor(Color.WHITE);//设置画笔颜色-验证码背景色
       graphics.fillRect(0, 0, width, height);//填充背景
       graphics.setFont(new Font("微软雅黑", Font.BOLD, 40));

//数字和字母的组合
       String baseNumLetter = "123456789abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";

StringBuilder builder = new StringBuilder();
       int x = 10;  //旋转原点的 x 坐标
       String ch;
       Random random = new Random();

for (int i = 0; i < 4; i++) {
           graphics.setColor(getRandomColor());

//设置字体旋转角度
           int degree = random.nextInt() % 30;  //角度小于30度
           int dot = random.nextInt(baseNumLetter.length());

ch = baseNumLetter.charAt(dot) + "";
           builder.append(ch);

//正向旋转
           graphics.rotate(degree * Math.PI / 180, x, 45);
           graphics.drawString(ch, x, 45);

//反向旋转
           graphics.rotate(-degree * Math.PI / 180, x, 45);
           x += 48;
       }

//画干扰线
       for (int i = 0; i < 6; i++) {
           // 设置随机颜色
           graphics.setColor(getRandomColor());

// 随机画线
           graphics.drawLine(random.nextInt(width), random.nextInt(height),
                   random.nextInt(width), random.nextInt(height));

}

//添加噪点
       for (int i = 0; i < 30; i++) {
           int x1 = random.nextInt(width);
           int y1 = random.nextInt(height);

graphics.setColor(getRandomColor());
           graphics.fillRect(x1, y1, 2, 2);
       }
       return builder.toString();
   }

/**
    * 随机取色
    */
   private static Color getRandomColor() {
       Random ran = new Random();
       return new Color(ran.nextInt(256),
               ran.nextInt(256), ran.nextInt(256));

}
}

创建UserController.java 类


package com.example.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class UserController {
   @RequestMapping("/login")
   public String login() {
       return "login";
   }
}

resources/templates目录下创建login.html


<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
   <meta charset="UTF-8">
   <title>Show User</title>
</head>
<body>
<a href="javascript:void(0);" rel="external nofollow" title="点击更换验证码">
   <img th:src="@{getVerifyCode}" onclick="changeCode()" class="verifyCode"/>
</a>
</body>
<!-- 引入JQuery -->
<script src="../static/js/jquery.min.js" th:src="@{/js/jquery.min.js}"></script>
<script>
   function changeCode() {
       const src = "/getVerifyCode?" + new Date().getTime(); //加时间戳,防止浏览器利用缓存
       $('.verifyCode').attr("src", src);
   }
</script>
</html>

启动项目访问http://localhost:8080/login

SpringBoot实现Thymeleaf验证码生成

点击图片可以更换验证码,至于后面的后台验证就不讲了。
参考文章后台java 实现验证码生成

来源:https://blog.csdn.net/qq_40548741/article/details/105311766

0
投稿

猜你喜欢

  • 刚刚接触Java不久,写法上和一些术语还不是很熟悉,如有不对的地方,希望指正。本次学生成绩系统要求能实现成绩录入, * ,绩点计算,退出系
  • MyBatis注解实现动态SQL在 Mybatis 中,使用注解可以很方便的进行sql操作,但很多动态 SQL 都是由 xml 配置实现的。
  • 首先,来看一下,快速排序的实现的动态图:快速排序介绍:快速排序,根据教科书说法来看,是冒泡排序的一种改进。快速排序,由一个待排序的数组(ar
  • 线程中断机制提供了一种方法,用于将线程从阻塞等待中唤醒,尝试打断目标线程的现有处理流程,使之响应新的命令。Java 留给开发者这一自由,我们
  • 01、多线程下扩容会死循环众所周知,HashMap 是通过拉链法来解决哈希冲突的,也就是当哈希冲突时,会将相同哈希值的键值对通过链表的形式存
  • 本文实例为大家分享了用JavaMail发送HTML模板邮件的具体代码,供大家参考,具体内容如下依赖<dependency>&nb
  • 年纪大了,以前做过的东西过阵子还是会忘,今天使用jenkins持续集成工具时用到了eclipse上传新maven工程至svn,上传完毕后改了
  • 没人会喜欢空指针异常!有什么方法可以避免它们吗?或许吧。。本文将讨论到以下几种技术1.Optional类型(Java 8中新引入的)2.Ob
  • 多继承指一个子类能同时继承于多个父类,从而同时拥有多个父类的特征,但缺点是显著的。1.若子类继承的父类中拥有相同的成员变量,子类在引用该变量
  • 文章描述跑马灯效果,功能效果大家应该都知道,就是当我们的文字过长,整个页面放不下的时候(一般用于公告等),可以让它自动实现来回滚动,以让客户
  • 之前已经为大家介绍过利用Java实现带GUI的气泡诗词特效,本文将为大家介绍另一种方法同样也可以实现气泡诗词的效果。下面是示例代码impor
  • 前言前面几篇我们学习的都是单表查询,就是对一张表中的数据进行查询。而实际项目中,基本都会有多张表联合查询的情况,今天我们就来了解下JPA的联
  • java模拟实现图书检索系统 (基础版),供大家参考,具体内容如下练习实现3个简单的功能,没有优化,可以根据需求,自行添加想要实现的功能。B
  • java常量池是一个经久不衰的话题,也是面试官的最爱,题目花样百出,这次好好总结一下。理论先拙劣的表达一下jvm虚拟内存分布:程序计数器是j
  • 我们知道,进入百度图片后,输入一个关键字后,首先看到的是很多缩略图,当我们点击某张缩略图时,我们就可以进入到大图显示页面,在大图显示页面,中
  • Java非法字符: &lsquo;\ufeff&lsquo;Java中项目启动出现 非法字符: '\ufeff
  • @RequestBody搭配@Data的坑如果用@Data修饰实体类,里面的属性最好不要用连续几个相同字母,如果用千万别用大写。比如下面这个
  • 学习平台微软开发者博客:https://devblogs.microsoft.com/?WT.mc_id=DT-MVP-5003986微软文
  • 1.SQL注入:程序向后台数据库传递SQL时,用户提交的数据直接拼接到SQL语句中并执行,从而导入SQL注入攻击。字符型注入:黑色部分为拼接
  • 简单介绍一下Java中的Excel文件导出功能(基于HttpServletResponse实现下载)首先,引入需要依赖的jar包:<d
手机版 软件编程 asp之家 www.aspxhome.com