【若依 - 前后端不分离版】SysCaptchaController 详解:生成与处理验证码

news2024/9/19 10:45:07

文章目录

    • 一、SysCaptchaController 类概述
      • 1. 类的功能
      • 2. 主要功能
    • 二、验证码生成流程
      • 1. 接口定义
      • 2. 代码流程解析
        • 2.1. 设置响应头
        • 2.2. 生成验证码
        • 2.3. 存储验证码
        • 2.4. 返回验证码图片
    • 三、处理异常和流关闭
      • 1. 异常处理
      • 2. 流关闭
    • 四、实际应用中的验证码处理
      • 1. 验证码生成和展示
      • 2. 验证码验证
      • 3. 错误调试和日志记录
    • 五、完整代码

在现代 Web 应用中,验证码用于增强安全性,防止恶意行为。本文将详细介绍 SysCaptchaController 类,该类负责生成并返回验证码图片。我们将探讨其核心功能、如何处理不同类型的验证码、以及代码中的关键实现细节,帮助开发者更好地理解和应用验证码生成技术。

一、SysCaptchaController 类概述

1. 类的功能

SysCaptchaController 是一个 Spring Boot 控制器类,用于生成并返回验证码图片。该控制器支持两种类型的验证码:

  • 算术验证码:例如:3 + 7 = ?
  • 字符验证码:例如:ABCD

2. 主要功能

  • 生成验证码图片:根据请求参数生成不同类型的验证码图片。
  • 设置响应头:确保验证码图片不会被缓存。
  • 将验证码存储到会话中:用于后续的验证码验证。

二、验证码生成流程

1. 接口定义

@GetMapping(value = "/captchaImage")
public ModelAndView getKaptchaImage(HttpServletRequest request, HttpServletResponse response)

此接口处理验证码生成的请求,并将验证码图片返回给客户端。

2. 代码流程解析

2.1. 设置响应头
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
response.setContentType("image/jpeg");

这些设置确保验证码图片不会被缓存,每次请求都会生成新的验证码图片。

2.2. 生成验证码
String type = request.getParameter("type");
BufferedImage bi = null;
String code = null;

if ("math".equals(type)) {
    String capText = captchaProducerMath.createText();
    code = capText.substring(capText.lastIndexOf("@") + 1);
    String capStr = capText.substring(0, capText.lastIndexOf("@"));
    bi = captchaProducerMath.createImage(capStr);
} else if ("char".equals(type)) {
    code = captchaProducer.createText();
    bi = captchaProducer.createImage(code);
}

根据请求参数中的 type,生成相应类型的验证码。captchaProducerMath 用于生成算术验证码,captchaProducer 用于生成字符验证码。

2.3. 存储验证码
HttpSession session = request.getSession();
session.setAttribute(Constants.KAPTCHA_SESSION_KEY, code);

将生成的验证码存储到用户的会话中,以便在后续的验证码验证中使用。

2.4. 返回验证码图片
try (ServletOutputStream out = response.getOutputStream()) {
    ImageIO.write(bi, "jpg", out);
    out.flush();
} catch (IOException e) {
    e.printStackTrace();
}

将生成的验证码图片通过响应流返回给客户端,并确保流在操作完成后正确关闭。

三、处理异常和流关闭

1. 异常处理

catch (Exception e) {
    e.printStackTrace();
}

捕获并打印异常信息,以便于调试和修复问题。

2. 流关闭

finally {
    try {
        if (out != null) {
            out.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

确保输出流在使用完毕后被正确关闭,防止资源泄露。

四、实际应用中的验证码处理

1. 验证码生成和展示

确保验证码图片能够正确生成,并在前端展示。客户端通过 GET 请求获取验证码图片,并将其展示给用户。

2. 验证码验证

在用户提交验证码时,将用户输入的验证码与存储在会话中的验证码进行比对。匹配成功则允许继续操作,否则返回错误信息提示用户。

// 示例:验证码验证
String storedCode = (String) session.getAttribute(Constants.KAPTCHA_SESSION_KEY);
if (!userInputCode.equals(storedCode)) {
    throw new VerificationCodeException("验证码错误");
}

3. 错误调试和日志记录

使用适当的日志记录工具来记录验证码生成和验证过程中的错误,以便于后续的调试和修复。

catch (Exception e) {
    logger.error("验证码生成或验证过程中发生错误", e);
}

五、完整代码

SysCaptchaController 类提供了一个有效的验证码生成和处理方案,通过生成算术或字符验证码并将其返回给客户端,提高了 Web 应用的安全性。

package com.ruoyi.web.controller.system;

import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.google.code.kaptcha.Constants;
import com.google.code.kaptcha.Producer;
import com.ruoyi.common.core.controller.BaseController;

/**
 * 图片验证码(支持算术形式)
 * 
 * @author ruoyi
 */
@Controller
@RequestMapping("/captcha")
public class SysCaptchaController extends BaseController
{
    @Resource(name = "captchaProducer")
    private Producer captchaProducer;

    @Resource(name = "captchaProducerMath")
    private Producer captchaProducerMath;

    /**
     * 验证码生成
     */
    @GetMapping(value = "/captchaImage")
    public ModelAndView getKaptchaImage(HttpServletRequest request, HttpServletResponse response)
    {
        ServletOutputStream out = null;
        try
        {
            HttpSession session = request.getSession();
            response.setDateHeader("Expires", 0);
            response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
            response.addHeader("Cache-Control", "post-check=0, pre-check=0");
            response.setHeader("Pragma", "no-cache");
            response.setContentType("image/jpeg");

            String type = request.getParameter("type");
            String capStr = null;
            String code = null;
            BufferedImage bi = null;
            if ("math".equals(type))
            {
                String capText = captchaProducerMath.createText();
                capStr = capText.substring(0, capText.lastIndexOf("@"));
                code = capText.substring(capText.lastIndexOf("@") + 1);
                bi = captchaProducerMath.createImage(capStr);
            }
            else if ("char".equals(type))
            {
                capStr = code = captchaProducer.createText();
                bi = captchaProducer.createImage(capStr);
            }
            session.setAttribute(Constants.KAPTCHA_SESSION_KEY, code);
            out = response.getOutputStream();
            ImageIO.write(bi, "jpg", out);
            out.flush();

        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if (out != null)
                {
                    out.close();
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
        return null;
    }
}

推荐:若依


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2056967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数模修炼之旅】05 拟合模型 深度解析(教程+代码)

【数模修炼之旅】05 拟合模型 深度解析(教程代码) 接下来 C君将会用至少30个小节来为大家深度解析数模领域常用的算法,大家可以关注这个专栏,持续学习哦,对于大家的能力提高会有极大的帮助。 1 拟合模型介绍及应用 …

无缝融入,即刻智能[三]:Dify-LLM平台知识库构建(多路召回、精排重排),43K+星标见证专属智能方案

无缝融入,即刻智能[三]:Dify-LLM平台知识库构建(多路召回、精排重排),43K+星标见证专属智能方案 大语言模型的训练数据一般基于公开的数据,且每一次训练需要消耗大量算力,这意味着模型的知识一般不会包含私有领域的知识,同时在公开知识领域存在一定的滞后性。为了解决这一…

SSM学生社团管理系统—计算机毕业设计源码20360

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 学生社团管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系…

python3爬虫(未完结)

一个简单的例子:爬取自己的csdn博客,统计每篇博客的访问量,制作一个柱状图,以访问量从大到小的方式显示。 1. 首先从“个人主页”爬取所有所有文章的链接 1.1 打开个人主页,右键->检查:可以看到每篇文章…

如何使用Java SpringBoot+Vue搭建二手闲置交易系统?

✍✍计算机毕业编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、…

四步解决国标设备接入问题

用国标协议完成多品牌设备统一接入,是智能设备在多场景应用中都会碰到的安装步骤。国标接入常常过程复杂,这边介绍一种相对简便的方法,用萤石开放平台的“国标设备添加工具”接入 Step1:私信我获取安装包 私信我获取国标设备添加…

Nginx服务器申请及配置免费SSL证书

免费SSL证书申请 背景: 我的情况是这样,域名解析是华为云的,然后免费证书在腾讯云申请。但是大致的配置流程都是一样的 在腾讯云平台申请免费的SSL证明(目前有效期是9天),申请步骤如下 主要步骤说明 申请免费SSL证书配置证书到域…

自定义变量添加到分机呼叫信息(mod_cti基于FreeSWITCH)

文章目录 前言联系我们添加流程1. 修改cti.json配置2. 配置自动外呼进入排队转坐席3. 变量同步到坐席通道 4. 导入号码添加自定义变量 前言 在默认配置中,分机的呼叫信息会被推送到redis的hash表中,hash表名:calls。我们可以通过修改配置&am…

【大模型LLMs】RAG实战:基于LlamaIndex快速构建RAG链路(Qwen2-7B-Instruct+BGE Embedding)

【大模型LLMs】RAG实战:基于LlamaIndex快速构建RAG链路(Qwen2-7B-InstructBGE Embedding) 1. 环境准备2. 数据准备3. RAG框架构建3.1 数据读取 数据切块3.2 构建向量索引3.3 检索增强3.4 main函数 参考 基于LlamaIndex框架,以Qwe…

【GitLab】使用 Docker 安装 GitLab 1:配置 SSH 端口

使用 Docker 安装 GitLab 要求修改ssh端口 GitLab 使用 SSH 通过 SSH 与 Git 交互。默认情况下,GitLab 使用端口22。 要在使用 GitLab Docker 映像时使用其他端口,您可以执行以下操作之一: 更改服务器的 SSH 端口(推荐)。 更改 GitLab Shell SSH 端口。 更改服务器的 SSH …

电测量数据交换DLMS∕COSEM组件第62部分:COSEM接口类(4)

1.7COSEM服务器模型 COSEM服务器被构建为3层体系结构如图3所示。 图4示例说明如何用COSEM服务器模型构建一台组合式计量设备。 1.8COSEM逻辑设备 1.8.1概述 COSEM逻辑设备包含一组COSEM对象,每个物理设备均应包含一个“Management logical device”。对COSEM逻辑设备…

MPLS相关实验

一、实验拓扑图以及实验要求 1、实验拓扑图 2、实验要求 合理利用IP地址进行分配R3、R4、R5、R6运行ospf在R2、R3、R4、R5、R6上运行MPLSR1上使用静态,R7上运行rip协议,R8上运行ospf协议全网可达 二、实验分析 合理利用IP地址进行分配R3、R4、R5、R6…

将自己的网站改造成可安装的PWA

概述 本文是一篇水文,感兴趣的读者可以看看。分享一下怎么讲自己的网站改造成可安装的PWA。 PWA简介 渐进式 Web 应用(Progressive Web App,PWA)是一个使用 web 平台技术构建的应用程序,但它提供的用户体验就像一个…

死锁问题分析和解决——资源回收时

1.描述问题 在完成线程池核心功能功能时,没有遇到太大的问题(Any,Result,Semfore的设计),在做线程池资源回收时,遇到了死锁的问题 1、在ThreadPool的资源回收,等待线程池所有线程退出时&#xff…

2024年【浙江省安全员-C证】复审模拟考试及浙江省安全员-C证作业模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 浙江省安全员-C证复审模拟考试参考答案及浙江省安全员-C证考试试题解析是安全生产模拟考试一点通题库老师及浙江省安全员-C证操作证已考过的学员汇总,相对有效帮助浙江省安全员-C证作业模拟考试学员顺利通…

C++进阶(14)类型转换、IO流

文章目录 一、类型转换C语言隐式类型转换强制类型转换 C类型转换的情况类型转换的函数(4个) 二、IO流1、缓冲区2、提高输入输出效率3、文件操作文件权限写操作 --- ofstream文本方式写入二进制方式写入 读操作 --- ifstream文本方式读取二进制方式读取 其…

如何使用DEV-C++做游戏?

我的B站视频做过关于python的小游戏开发,但很多小伙伴希望通过C做一些有趣的动画或游戏,该怎么实现呢? B站:bigbigli_大李 大家好,我是大李。 今天主要跟大家谈谈如何通过C做一些小游戏开发,这里我们就 使用…

JavaScript - Api学习 Day02(事件监听、流、委托)

事件监听 一、事件监听1.1 什么是事件、事件监听1.1.1 事件监听的基本流程1.1.2 重点关注以下三个核心要素 1.2 Event handling models 事件处理模型1.2.1 DOM Level 版本(1)DOM Level 0(2)DOM Level 2 1.2.2 事件类型&#xff08…

iPad协议08算法

微信协议就是基于微信IPad协议的智能控制系统,利用人工智能AI技术、云计算技术、虚拟技术、边缘计算技术、大数据技术,打造出智能桌面系统RDS、 智能聊天系统ACS 、智能插 件系统PLUGIN 、云计算服务CCS 、任务管理系统TM、设备管理服务DM、 应用管理系统…

ECCV 2024亮点:APGCC技术刷新人群计数与定位的SOTA

摘要 在ECCV 2024会议上,一项名为APGCC的新技术以其卓越的性能引起了广泛关注。这项技术通过创新的方法,显著提高了人群计数和定位的准确性和鲁棒性,为监控、事件管理和城市规划等领域带来了新的解决方案。 正文: 随着城市化进…