综合性练习-验证码

1. 验证码案例

随着安全性的要求越来越高,目前项目中很多都使用了验证码,验证码的形式也是多种多样,更复杂的图形验证码和⾏为验证码已经成为了更流⾏的趋势.

2. 需求

 界面如下图所示

1. 页面生成验证码

2. 输入验证码,点击提交,验证用户输入验证码是否正确,正确则进行页面跳转


 

3. 准备工作

创建项⽬,引⼊SpringMVC的依赖包,把前端页面放在项目中.

导入依赖

Hutool🍬一个功能丰富且易用的Java工具库,涵盖了字符串、数字、集合、编码、日期、文件、IO、加密、数据库JDBC、JSON、HTTP客户端等功能。插件的依赖

<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-captcha -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-captcha</artifactId>
    <version>5.8.20</version>
</dependency>

4. 接口定义 

  • 生成验证码

url: /captcha/get

param(参数): 无

Return: 图片的内容

  • 校验验证码

url: /captcha/check

param: inputCode  (用户输入的验证码)

return: true / false

5. 代码编写

生成验证码: 

@RequestMapping("/captcha")
@RestController
public class CaptchaController {@RequestMapping("/get")public void getCaptcha(HttpServletResponse response) {LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200,100);//图型验证码写出,可以写出到文件,也可以写出到流try {lineCaptcha.write(response.getOutputStream());  //返回到浏览器} catch (IOException e) {throw new RuntimeException(e);}}
}

修改前端代码相对应的接口

 验证成功

校验验证码 

校验前端用户输入返回的验证码是否正确

问题: 会有多个用户同时访问,就要考虑多线程问题,得到的验证码就不能放到同一个变量里

解决方法: 把每个不同用户生成的验证码放到与之相对应的session里储存

//图型验证码写出,可以写出到文件,也可以写出到流try {lineCaptcha.write(response.getOutputStream());  //返回到浏览器//得到函数生成的验证码String code = lineCaptcha.getCode();  //得到函数生成的验证码//存储到session//必须考虑到多线程访问,因为有多个用户访问,把每个用户生成的code存放到对应用户的session里面session.setAttribute("captcha_session_key", code);//获取一个时间戳存入session,来设置验证码的有效期(这是得到设置code的时间戳)session.setAttribute("captcha_session_data",new Date());} catch (IOException e) {throw new RuntimeException(e);}

取出用户session里的验证码与用户输入的验证码匹配,符合的话就返回true

还添加了验证码过期的功能

@RequestMapping("/captcha")
@RestController
public class CaptchaController {private final static long session_valid_timeout = 60*1000;@Autowiredprivate CaptchaProperties captchaProperties;@RequestMapping("/get")public void getCaptcha(HttpSession session, HttpServletResponse response) {LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(captchaProperties.getWidth(),captchaProperties.getHeight());//图型验证码写出,可以写出到文件,也可以写出到流try {lineCaptcha.write(response.getOutputStream());  //返回到浏览器//得到函数生成的验证码String code = lineCaptcha.getCode();  //得到函数生成的验证码//存储到session//必须考虑到多线程访问,因为有多个用户访问,把每个用户生成的验证码存放到对应用户的session里面session.setAttribute(captchaProperties.getSession().getKey(), code);//获取一个时间戳存入session,来设置验证码的有效期(这是得到设置code的时间戳)session.setAttribute(captchaProperties.getSession().getDate(),new Date());response.getOutputStream().close();} catch (IOException e) {throw new RuntimeException(e);}}@RequestMapping("/check")public boolean check(String inputCode, HttpSession session) {//验证码生成的内容和用户输入的内容进行比较if (!StringUtils.hasLength(inputCode)) {  //如果为空return false;}//从session获取信息String saveCode = (String) session.getAttribute(captchaProperties.getSession().getKey());  //前端页面生成的验证码Date saveData = (Date) session.getAttribute(captchaProperties.getSession().getDate());if(inputCode.equalsIgnoreCase(saveCode)) {  //忽略大小写进行判断//判断验证码是否过期if (saveData != null && System.currentTimeMillis()-saveData.getTime() < session_valid_timeout){return true;}}return false;}
}

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

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

相关文章

MySQL第一次作业(基本操作)

目录 一、登陆数据库 二、创建数据库zoo 三、修改数据库zoo字符集为gbk 四、选择当前数据库为zoo 五、查看创建数据库zoo信息 六、删除数据库zoo 一、登陆数据库 指令&#xff1a; mysql -u root -p 二、创建数据库zoo 指令&#xff1a; create database zoo; 三、修改数…

2024新零售行业多元化用工报告

来源&#xff1a;君润人力 近期历史回顾&#xff1a;

Springboot开发 -- Postman 调试 session 验证 接口

当我们在开发Spring Boot应用时&#xff0c;经常会遇到带有Session验证的接口&#xff0c;这些接口需要用户先登录并获取到Session ID&#xff08;或称为cookie中的JSESSIONID&#xff09;&#xff0c;然后在后续的请求中携带这个Session ID来保持会话状态。下面我将以一个实际…

STM32 FSMC接口控制SRAM(芯片型号:IS61WV102416BLL)

目录 概述 1 硬件介绍 1.1 SRAM的电路 1.2 IS61WV102416ALL芯片 2 STM32Cube配置工程 2.1 配置FSMC 2.2 其他参数配置 2.3 生成工程 3 SRAM的功能验证 3.1 编写测试函数 3.1.1 写数据函数 3.1.2 读数据函数 3.2 完整代码 4 测试 测试代码下载地址&#xff1a; s…

代码随想录——二叉树的最大深度(Leetcode104)

题目链接 层序遍历 当遍历到二叉树每一层最后一个节点时&#xff0c;depth /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* …

UART 16550 IP核使用详解

AXI UART 16550是Xilinx FPGA中提供的一个UART IP核&#xff0c;它允许通过AXI接口与UART设备进行通信。本文描述了如何使用Xilinx的Vivado Design Suite环境中的工具来定制和生成 UART 16550 IP核&#xff0c;以及如何配置和使用该IP核。 1 UART 16550 IP核的使用 以下是针对…

【算法】网络图中的dfs

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、单词搜索二、黄金矿工三、不同路径 |||四、图像渲染五、岛屿数量六、岛屿的最大面积七、被围绕的区域…

SSD与HDD仍然共存,并将长期共存!

在技术快速迭代的今天&#xff0c;固态硬盘&#xff08;SSD&#xff09;与传统硬盘&#xff08;HDD&#xff09;之间的竞争一直是存储领域的一大焦点。 扩展阅读&#xff1a; HDD回暖于2024&#xff0c;与SSD决战于2028 HDD的烦恼&#xff1a;HAMR会让SMR黯然失色吗&#xff…

Github 2024-05-12 php开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Filament: 加速Laravel开发的完美起点 创建周期:1410 天开发语言:PHP协议类型:MIT LicenseStar数量:12228 个Fork数量:1990 次关…

电路元件伏安特性的测量

实验目的&#xff1a; 1. 掌握线性电阻、非线性电阻元件伏安特性的测量方法&#xff1b; 2. 掌握伏安测量法中测量样点的选择和绘制曲线的方法&#xff1b; 3. 学习直读式仪表和直流稳压电源等设备的使用方法。 实验原理、内容及步骤&#xff1a; 电路元件的特性一般可用该元…

前端简史之崛起:Router迁鼎

引 &#x1f4a1; Ajax 的出现&#xff0c;带来了 jQuery 时代&#xff1b;Node技术的发展&#xff0c;带来了前端工程化进阶&#xff1b;如果说前面二者是带来技术的革命&#xff0c;那么前端路由方案的多样化则带来了用户体验的升级以及项目管理的优化。 课程简介 《前端简史…

train_gpt2_fp32.cu - main

llm.c/test_gpt2_fp32.cu at master karpathy/llm.c (github.com) 源码 // ---------------------------------------------------------------------------- // main training loop int main(int argc, char *argv[]) {// read in the (optional) command line argumentsco…

C语言性能深度剖析:从底层优化到高级技巧及实战案例分析

C语言以其接近硬件的特性、卓越的性能和灵活性&#xff0c;在系统编程、嵌入式开发和高性能计算等领域中占据着举足轻重的地位。本文将深入探讨C语言性能优化的各个方面&#xff0c;包括底层原理、编译器优化、内存管理和高级编程技巧&#xff0c;并结合多个代码案例来具体分析…

6大部分,20 个机器学习算法全面汇总!!建议收藏!(上篇)

前两天有小伙伴说想要把常见算法的原理 公式汇集起来。 这样非常非常方便查看&#xff01;分为上下两篇&#xff0c;下篇地址&#xff1a; 本次文章分别从下面6个方面&#xff0c;涉及到20个算法知识点&#xff1a; 监督学习算法 无监督学习算法 半监督学习算法 强化学习…

PyQt5多线程全面系统地学习

文章目录 1. 基础知识1.1 简介1.1.1 多线程与多进程的概念多线程 (Multithreading)多进程 (Multiprocessing)1.1.2 多线程与多进程的区别1.1.3 应用场景多线程应用场景多进程应用场景 1.2 Python标准库中的线程与进程库1.2.1 threading 模块基本概念1.2.2 总结 2. PyQt5的多线程…

pytorch_trick(2) 在Jupyter初始化过程中自动加载常用包的设置方法

一、在Jupyter初始化过程中自动加载常用包的设置方法 在每一节课程的开头&#xff0c;我们都要导入常用包&#xff0c;由于这项工作重复而固定&#xff0c;因此我们也可以通过配置jupyter&#xff08;准确来说应该是ipython&#xff09;的startup文件&#xff0c;来使得每次新创…

Python函数之旅专栏(导航)

Python内置函数(参考版本:3.11.8)AELRabs( )enumerate( )len( )range( )aiter( )eval( )list( )repr( )all( )exec( )locals( )reversed( )anext( )round( )any( ) ascii( )FM  filter( )map( )S float( )max( )set( )Bformat( )memoryview( )setattr( )bin( )frozenset( )…

设计模式与软件体系结构课后练习参考答案

目录 软件设计模式第二章 创建型软件设计模式1. 工厂模式2. 生成器模式3. 单例模式 第三章 结构型软件设计模式1. 组合模式2. 适配器模式3. 外观模式4. 桥接模式 第四章 行为型软件设计模式1. 迭代器模式2. 访问者模式3. 中介者模式4. 策略模式5. 状态模式 案例分析工厂模式案例…

2010-2024年各地级市社会信用体系建设匹配DID数据

2010-2024年各地级市社会信用体系建设匹配DID数据 1、时间&#xff1a;2010-2024年 2、指标&#xff1a;行政区划代码、年份、所属省份、地区、社会信用体系建设示范区 3、范围&#xff1a;310个地级市 4、来源&#xff1a;国家发改委 5、指标解释&#xff1a; 社会信用体…

USB-OTG:1、OTG原理介绍

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…