当前位置: 首页 > news >正文

springboot实现验证码功能

转载自 : www.javaman.cn

1、编写工具类生成4位随机数

该工具类主要生成从0-9,a-z,A-Z范围内产生的4位随机数

/*** 产生4位随机字符串*/public static String getCheckCode() {String base = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";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();}
2、编写常量类

用户常量的绑定,所有的常量都可以在ConfigConsts中定义,方便管理。

import java.util.Arrays;
import java.util.List;public interface ConfigConsts {/*** 验证码存session*/String IMAGE_CODE_SESSION = "IMAGE_CODE";
}
3、获取验证码接口

这段代码的主要作用是为用户生成一个图片验证码,并将其显示在浏览器中。当调用该代码对应的URL时,服务器会创建一个包含随机验证码的图片,并将此验证码存储在用户的会话中,然后将该图片发送给用户的浏览器显示

     /*** 验证码*/@RequestMapping("/getImgCode")public void getImgCode(HttpServletRequest request, HttpServletResponse response) {int width = 80;int height = 30;BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//获取画笔Graphics graphics = image.getGraphics();//设置画笔颜色为白色graphics.setColor(Color.white);//填充图片graphics.fillRect(0, 0, width, height);//设置画笔颜色为黑色graphics.setColor(Color.black);//设置字体的小大graphics.setFont(new Font("黑体", Font.BOLD, 24));//产生4个随机验证码String checkCode = CommonUtil.getCheckCode();//将验证码放入HttpSession中HttpSession session = request.getSession();session.setAttribute(ConfigConsts.IMAGE_CODE_SESSION, checkCode);//向图片上写入验证码graphics.drawString(checkCode, 15, 25);//将内存中的图片输出到浏览器try {response.setContentType("image/png");ImageIO.write(image, "PNG", response.getOutputStream());} catch (IOException e) {e.printStackTrace();}}
4、controller跳转到登录页

对“/loginPage”的GET请求,并将用户重定向到登录页面。当调用这个URL时,系统会返回一个名为"login"的视图(通常是一个HTML页面),这个视图通常用于显示登录表单,让用户输入用户名和密码等信息。

    /*** 跳转到登陆页面* @return 登陆页面*/@GetMapping("/loginPage")public String loginPage(){return "login";}
5、登录界面

在Web页面上实现一个图形验证码的输入功能

  1. HTML部分
    • 创建一个表单项,内部包含两列(使用layui的栅格系统)。
    • 在第一列中,有一个标签和一个文本输入框。标签用于显示一个验证码图标,输入框用于用户输入图形验证码。
    • 在第二列中,有一个图片元素用于显示图形验证码图片。
  2. JavaScript部分
    • 配置layui的静态资源路径和主入口模块。
    • 初始化时,调用getImgCode函数加载验证码图片,并渲染表单。
    • getImgCode函数通过Ajax请求从服务器获取验证码图片,并将其显示在页面上的图片元素中。

这段代码主要利用了layui框架来实现页面的布局和交互,同时通过JavaScript和Ajax实现与服务器的通信,以获取并显示图形验证码。

<div class="layui-form-item"><div class="layui-row"><div class="layui-col-xs7"><label class="layadmin-user-login-icon layui-icon layui-icon-vercode"></label><input type="text" name="code"  lay-verify="required" placeholder="图形验证码" class="layui-input"></div><div class="layui-col-xs5"><div style="margin-left: 10px;"><img id="codeImg" class="layadmin-user-login-codeimg"></div></div></div><script>layui.config({base: '/static/layuiadmin/' //静态资源所在路径}).extend({index: 'lib/index' //主入口模块}).use(['index', 'user'], function(){let $ = layui.$,form = layui.form;// 初始化getImgCode();form.render();}/*** 获取验证码*/function getImgCode() {let url = ctx + '/getImgCode';let xhr = new XMLHttpRequest();xhr.open('GET', url, true);xhr.responseType = "blob";xhr.onload = function() {if (this.status === 200) {let blob = this.response;document.getElementById("codeImg").src = window.URL.createObjectURL(blob);}}xhr.send();}</script>
6、验证码过滤

校验验证码的过滤器,基于Java的Spring框架。

  1. 该过滤器继承了OncePerRequestFilter,确保每次请求只被过滤一次。
  2. doFilterInternal方法中,它首先检查请求是否是登录请求(通过检查请求路径是否为"/login"以及请求方法是否为"POST")。
  3. 如果是登录请求,它会调用validate方法来校验验证码。
  4. validate方法从请求中获取验证码,然后与会话中存储的验证码进行比对。如果验证码不存在、为空或不匹配,将抛出异常。
  5. 如果验证码校验失败,过滤器会捕获异常,并向响应中写入错误信息(以JSON格式)。
  6. 如果请求不是登录请求,过滤器不会进行验证码校验,直接让请求继续向下执行(通过调用filterChain.doFilter)。
  7. 如果登录请求成功通过验证码校验,代码会继续执行后续的过滤器或处理器。
@Component
public class ValidateCodeFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {// 登陆请求if ("/login".equals(httpServletRequest.getServletPath()) &&"POST".equalsIgnoreCase(httpServletRequest.getMethod())){try {validate(httpServletRequest);} catch (Exception exception) {httpServletResponse.setCharacterEncoding("utf-8");httpServletResponse.setContentType("application/json;charset=UTF-8");PrintWriter writer = httpServletResponse.getWriter();writer.write(JSON.toJSONString(Result.failure(exception.getMessage())));writer.flush();return;}}// 不是一个登录请求,不做校验 直接通过filterChain.doFilter(httpServletRequest, httpServletResponse);}private void validate(HttpServletRequest request) {String code = request.getParameter("code");if (StringUtils.isBlank(code)){throw new RuntimeException("验证码不能为空");}Object checkCode = request.getSession(false).getAttribute(ConfigConsts.IMAGE_CODE_SESSION);if (Objects.isNull(checkCode)) {throw new RuntimeException("验证码不存在");}if (!StringUtils.equalsIgnoreCase(code,checkCode.toString())) {throw new RuntimeException("验证码不匹配");}request.getSession(false).removeAttribute(ConfigConsts.IMAGE_CODE_SESSION);}
}
7、集成mysecurity

集成Spring Security的安全配置类,用于Web应用的安全性设置。

  1. 通过@EnableWebSecurity@Configuration注解,启用并配置Spring Security。
  2. 使用@EnableGlobalMethodSecurity(prePostEnabled = true)来启用全局方法级别的安全性,允许使用例如@PreAuthorize@PostAuthorize等注解。
  3. 定义了一个名为MySecurityConfig的配置类,该类继承自WebSecurityConfigurerAdapter,用于定制安全性设置。
  4. 通过@Autowired注入了一个名为validateCodeFilter的验证码过滤器实例。
  5. configure(HttpSecurity http)方法中,对应用的安全性进行了详细配置:
    • 允许所有人访问/loginPage/getImgCode这两个路径,不进行任何安全检查。
    • 对所有其他请求,需要用户进行身份验证(即需要登录后才能访问)。
    • 在用户名和密码验证过滤器之前,添加了一个自定义的验证码过滤器(validateCodeFilter),用于在登录过程中校验验证码。

这段代码的主要目的是增强Web应用的安全性,限制了只有经过身份验证的用户才能访问应用的受保护资源。

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MySecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate ValidateCodeFilter validateCodeFilter;@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests()// 放过.antMatchers("/loginPage", "/getImgCode").permitAll().anyRequest().authenticated().and()// 过滤登录验证码.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class)}

运行结果如下:

在这里插入图片描述

相关文章:

springboot实现验证码功能

转载自 : www.javaman.cn 1、编写工具类生成4位随机数 该工具类主要生成从0-9&#xff0c;a-z&#xff0c;A-Z范围内产生的4位随机数 /*** 产生4位随机字符串*/public static String getCheckCode() {String base "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn…...

内测分发平台是否支持应用的微服务化部署

内测分发平台的微服务化部署支持是现代应用开发和部署的一个重要特性。首先我们得知道什么是微服务化部署都有哪些关键功能&#xff0c;如何实施微服务化的部署。下文以我自己理解总结了几点。 图片来源:news.gulufenfa.com 微服务是一种基于独立运行的小型服务来构建应用程序…...

1140. 最短网络,prim算法,模板题

1140. 最短网络 - AcWing题库 农夫约翰被选为他们镇的镇长&#xff01; 他其中一个竞选承诺就是在镇上建立起互联网&#xff0c;并连接到所有的农场。 约翰已经给他的农场安排了一条高速的网络线路&#xff0c;他想把这条线路共享给其他农场。 约翰的农场的编号是1&#xf…...

升级jdk17过程中,原来的jdk8下的webservice客户端怎样处理

背景&#xff1a;之前jdk8环境下&#xff0c;使用的cxf框架&#xff0c;而且是动态加载解析作为客户端。大家一直相处的很愉快。但是最近升级jdk17&#xff0c;发现cxf不好用了。网上百度&#xff0c;大部分都是说升级cxf版本&#xff0c;并且添加jaxb的相关依赖就可以了。但是…...

Verilog基本语法概述

一、概述 Verilog 是一种用于数字逻辑电路设计的硬件描述语言&#xff0c;可以用来进行数字电路的仿真验证、时序分析、逻辑综合。 既是一种 行为级&#xff08;可用于电路的功能描述&#xff09; 描述语言又是一种 结构性&#xff08;可用于元器件及其之间的连接&#xff09…...

论文阅读:C2VIR-SLAM: Centralized Collaborative Visual-Inertial-Range SLAM

前言 论文全程为C2VIR-SLAM: Centralized Collaborative Visual-Inertial-Range Simultaneous Localization and Mapping&#xff0c;是发表在MDPI drones&#xff08;二区&#xff0c;IF4.8&#xff09;上的一篇论文。这篇文章使用单目相机、惯性测量单元( IMU )和UWB设备作为…...

蓝桥杯刷题day01——字符串中的单词反转

题目描述 你在与一位习惯从右往左阅读的朋友发消息&#xff0c;他发出的文字顺序都与正常相反但单词内容正确&#xff0c;为了和他顺利交流你决定写一个转换程序&#xff0c;把他所发的消息 message 转换为正常语序。 注意&#xff1a;输入字符串 message 中可能会存在前导空…...

Python---引用变量与可变、非可变类型

引用变量 在大多数编程语言中&#xff0c;值的传递通常可以分为两种形式“ 值 传递 与 引用 传递”&#xff0c;但是在Python中变量的传递基本上都是引用传递。 变量在内存底层的存储形式 a 10 第一步&#xff1a;首先在计算机内存中创建一个数值10&#xff08;占用一块…...

GDOUCTF2023-Reverse WP

文章目录 [GDOUCTF 2023]Check_Your_Luck[GDOUCTF 2023]Tea[GDOUCTF 2023]easy_pyc[GDOUCTF 2023]doublegame[GDOUCTF 2023]L&#xff01;s&#xff01;[GDOUCTF 2023]润&#xff01;附 [GDOUCTF 2023]Check_Your_Luck 根据 if 使用z3约束求解器。 EXP&#xff1a; from z3 i…...

Day43力扣打卡

打卡记录 子数组的最小值之和&#xff08;乘法原理 单调栈&#xff09; 大佬的题解 class Solution:def sumSubarrayMins(self, arr: List[int]) -> int:n len(arr)# 左边界 left[i] 为左侧严格小于 arr[i] 的最近元素位置&#xff08;不存在时为 -1&#xff09;left, s…...

elementui的table合并列,三个一组

<el-table :span-method"objectSpanMethod" :cell-style"iCellStyle" :data"tableData" height"63vh" border style"width: 100%; margin-top: 6px"><el-table-column type"index" label"序号"…...

HarmonyOS-Service服务开发(一)

文章目录 创建新项目启动Serviceets获取service的bundleName DataAbility开发指导开发Data步骤创建Data 创建新项目 ServiceAbility开发指导 在config.json中也有配置出现 启动Service ets获取service的bundleName 项目的bundleName service的bundleName 这里serviceAbil…...

FLASK博客系列4——再谈路由

最近好像拖更有点久了。抱歉抱歉~ 今天我们继续来聊聊路由&#xff08;其实就是我上次偷懒剩下一点没讲完&#xff09;。 通过上次的文章&#xff0c;我们基本了解了Flask中的路由&#xff0c;是不是比较简单呢&#xff1f;别急&#xff0c;今天来点猛料。 一、路由之HTTP方法绑…...

sql之left join、right join、inner join的区别

sql之left join、right join、inner join的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 inner join(等值连接) 只返回两个表中联结字段相等的行 举例如下&#xff1…...

京东秒杀之秒杀详情

1 编写前端页面&#xff08;商品详情&#xff09; <!DOCTYPE html> <head><title>商品详情</title><meta http-equiv"Content-Type" content"text/html; charsetUTF-8" /><script type"text/javascript" src&…...

mobaxterm 下载、安装、使用

下载 官网 MobaXterm free Xserver and tabbed SSH client for Windows 下载页面 MobaXterm Xserver with SSH, telnet, RDP, VNC and X11 - Download 点击下载 安装 双击安装 勾选协议 修改安装路径 &#xff0c;等待安装完成 使用 启动 新建连接 输入主机用户名和密…...

办公技巧:Word中插入图片、形状、文本框排版技巧

目录 一、插入图片排版技巧 二、添加形状排版技巧 三、插入“文本框”排版技巧 我们平常在制作word时候经常会遇到插入选项卡下的图片、形状和文本框这三种情况下&#xff0c;那么如何使得Word文档当中添加这三个元素的同时&#xff0c;又能保证样式美观呢&#xff0c;今天小…...

apple macbook M系列芯片安装 openJDK17

文章目录 1. 查找openjdk版本2. 安装openjdk3. 多jdk之间的切换 在这里我们使用 brew 命令查找并安装。 1. 查找openjdk版本 执行&#xff1a;brew search openjdk&#xff0c;注意&#xff1a;执行命令后&#xff0c;如果得到的结果中没有红框内容&#xff0c;则需要更新一下…...

C语言——打印出所有的“水仙花数”

所谓水仙花数,是指一个3位数,其各位数字立方和等于该数本身。水仙花数是指一个三位数&#xff0c;它的每个位上的数字的立方和等于它本身。例如&#xff0c;153是一个水仙花数&#xff0c;因为1^3 5^3 3^3 153。 #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>…...

<HarmonyOS第一课>应用程序框架 【课后考核】

【习题】应用程序框架 判断题 一个应用只能有一个UIAbility。错误(False)创建的Empty Ability模板工程&#xff0c;初始会生成一个UIAbility文件。正确(True)每调用一次router.pushUrl()方法&#xff0c;页面路由栈数量均会加1。错误(False) 单选题 API9及以上&#xff0c;r…...

PyTorch 2.8镜像惊艳效果展示:CogVideoX在4090D上的长视频生成稳定性

PyTorch 2.8镜像惊艳效果展示&#xff1a;CogVideoX在4090D上的长视频生成稳定性 1. 专业级视频生成环境介绍 当我们需要处理长视频生成这种高计算负载任务时&#xff0c;一个稳定且高性能的运行环境至关重要。基于RTX 4090D 24GB显卡和CUDA 12.4深度优化的PyTorch 2.8镜像&a…...

20个核心AI概念轻松入门:收藏这份小白友好指南,开启大模型学习之旅!

如果你曾尝试学习AI&#xff0c;大概率至少有过一次这样的感受……“这到底在讲什么&#xff1f;” 术语太多。 工具太多。 网上所有人都说得好像理所当然。 学习AI很容易让人感到崩溃。 尤其如果你不是直接从事这一行&#xff0c;几乎像在学一门全新的语言。 但我逐渐意识到一…...

杰理蓝牙芯片的key文件机制解析:从原理到实践

1. 杰理蓝牙芯片key文件机制揭秘 第一次接触杰理蓝牙芯片的开发者&#xff0c;往往会在项目初期就被一个神秘文件难住——key文件。这个看似简单的文件背后&#xff0c;却藏着杰理芯片架构设计的核心逻辑。我在调试AC6905芯片时就踩过坑&#xff1a;当时直接烧录了未加密的固件…...

别再让UI卡死了!C# UDP接收数据,用异步和Task轻松搞定后台监听

现代C# UDP通信实践&#xff1a;用异步编程拯救你的UI线程 在桌面应用开发中&#xff0c;实时数据接收是许多场景的核心需求——从工业传感器监控到金融行情展示&#xff0c;再到游戏服务器状态更新。传统多线程方案虽然能解决问题&#xff0c;却常常带来UI卡顿、资源泄漏等&qu…...

【在Spring AI项目中如何通过代码为文档添加元信息的实用指南】

在Spring AI项目中如何通过代码为文档添加元信息的实用指南当你在处理大量数据时&#xff0c;无论是在Spring AI项目中还是其他任何地方&#xff0c;你可能会发现自己需要一种方法来组织和理解数据。这就是元信息&#xff08;Metadata&#xff09;发挥作用的地方。在本篇博客中…...

从NeRF到ConvONet:手把手教你用Python和PyTorch搭建自己的三维重建模型(附代码)

从NeRF到ConvONet&#xff1a;手把手教你用Python和PyTorch搭建自己的三维重建模型&#xff08;附代码&#xff09; 三维重建技术正在彻底改变我们与数字世界的交互方式。想象一下&#xff0c;仅凭几张照片就能重建出精细的3D模型&#xff0c;或者通过简单的视频输入实时生成三…...

从医学影像到自动驾驶:Grad-CAM如何成为AI模型‘合规’与‘可信’的敲门砖?

Grad-CAM&#xff1a;撬动AI可信革命的视觉解释引擎 当一位放射科医生面对AI系统标注的肺部CT影像时&#xff0c;他真正需要的不只是一个"疑似恶性肿瘤"的结论&#xff0c;而是想知道&#xff1a;这个判断究竟基于病灶的哪些特征&#xff1f;同样&#xff0c;当自动驾…...

魔兽争霸3终极兼容性修复:5大核心功能彻底解决90%游戏问题

魔兽争霸3终极兼容性修复&#xff1a;5大核心功能彻底解决90%游戏问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3启动闪退、画面…...

电竞椅哪个牌子质量好?傲风M6Pro,告诉你什么是“开挂式”舒适

对于热爱电竞的玩家来说&#xff0c;电竞椅早已不只是“坐着玩游戏”的工具&#xff0c;而是影响状态、决定胜负的关键装备。市面上的电竞椅品牌琳琅满目&#xff0c;电竞椅哪个牌子质量好&#xff1f;我们从市场地位、腰背支撑、材质工艺、调节灵活性等维度&#xff0c;深度解…...

Vue2项目中print.js的进阶打印功能实战指南

1. 为什么选择print.js实现Vue2打印功能 第一次在Vue2项目里遇到打印需求时&#xff0c;我试过好几种方案。原生window.print()功能太简陋&#xff0c;直接打印整个页面根本没法用&#xff1b;PDF生成又太重&#xff0c;需要后端配合。直到发现print.js这个轻量级库&#xff0c…...