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

【Java 进阶篇】Java Web开发:实现验证码功能

在这里插入图片描述

在Web应用程序中,验证码(CAPTCHA)是一种常见的安全工具,用于验证用户是否为人类而不是机器。验证码通常以图像形式呈现,要求用户在登录或注册时输入正确的字符。在这篇文章中,我们将详细介绍如何在Java Web应用程序中实现验证码功能。

什么是验证码?

验证码是“全自动区分计算机和人类的公证测试”(Completely Automated Public Turing test to tell Computers and Humans Apart)的缩写。它是一种用于识别用户是否为真实人类的技术。验证码通常包括一个随机生成的字符串,用户需要在输入框中输入正确的字符串以证明他们不是机器人。

验证码的主要目的是防止自动化机器人攻击,例如恶意注册帐户、暴力破解密码或发垃圾邮件。通过要求用户执行某种人类可识别的操作,如识别字符或选择特定图像,可以降低自动化机器人的效率。

验证码的种类

在Web开发中,有多种类型的验证码,包括:

  1. 字符验证码:用户需要识别并输入一个包含随机字符的图像。
  2. 图像验证码:用户需要在一组图像中选择特定的图像,以证明他们是人类。
  3. 数学验证码:用户需要解决一个简单的数学问题,如加法或减法,以证明他们是人类。
  4. 音频验证码:用户需要听取和输入一个音频中的数字或单词。
  5. 滑块验证码:用户需要拖动一个滑块来证明他们是人类。

在本文中,我们将重点介绍字符验证码的实现,这是最常见的验证码类型之一。

实现字符验证码

要实现字符验证码,我们将使用Java的Servlet技术和一些开源库。以下是步骤:

步骤1:创建一个新的Java Web项目

首先,您需要创建一个新的Java Web项目。您可以使用Eclipse、IntelliJ IDEA或任何其他您喜欢的IDE。在项目中,创建一个新的Servlet,我们将在其中实现验证码生成和呈现。

步骤2:导入必要的库

为了生成验证码图像,我们将使用Java的BufferedImage类。此外,我们还需要用于生成随机字符的Java库。在web.xml文件中,将Servlet的URL映射设置为您希望验证码可访问的URL路径。

<servlet><servlet-name>CaptchaServlet</servlet-name><servlet-class>com.example.CaptchaServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>CaptchaServlet</servlet-name><url-pattern>/captcha</url-pattern>
</servlet-mapping>

步骤3:实现CaptchaServlet

现在,我们将实现CaptchaServlet,这是生成和呈现验证码的核心部分。以下是一个示例实现:

@WebServlet("/captcha")
public class CaptchaServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {int width = 200;int height = 50;// 创建一个图像缓冲区BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 获取图形上下文Graphics2D g2d = bufferedImage.createGraphics();// 设置背景颜色g2d.setColor(Color.white);g2d.fillRect(0, 0, width, height);// 生成随机字符String captchaText = generateRandomString(5); // 生成包含5个字符的随机字符串// 将验证码文本存储在Session中,以便稍后验证HttpSession session = request.getSession();session.setAttribute("captcha", captchaText);// 设置字体和字体大小g2d.setFont(new Font("SansSerif", Font.BOLD, 24));// 设置文本颜色g2d.setColor(Color.black);// 在图像上绘制验证码文本g2d.drawString(captchaText, 50, 30);// 添加一些噪音,使验证码更难以识别addNoise(g2d, width, height);// 设置响应内容类型response.setContentType("image/png");// 获取响应的输出流OutputStream os = response.getOutputStream();// 将图像写入响应ImageIO.write(bufferedImage, "png", os);// 关闭输出流os.close();}// 生成随机字符串private String generateRandomString(int length) {String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";StringBuilder randomString = new StringBuilder();Random random = new Random();for (int i = 0; i < length; i++) {int index = random.nextInt(characters.length());randomString.append(characters.charAt(index));}return randomString.toString();}// 添加噪音private void addNoise(Graphics2D g2d, int width, int height) {Random random = new Random();for (int i = 0; i < 100; i++) {int x = random.nextInt(width);int y = random.nextInt(height);int size = random.nextInt(5);g2d.setColor(new Color(random.nextFloat(), random.nextFloat(), random.nextFloat()));g2d.fillRect(x, y, size, size);}}
}

在这个示例中,我们首先创建一个BufferedImage对象,然后使用Graphics2D对象绘制验证码图像。验证码文本是通过generateRandomString方法生成的,并存储在Session中以供稍后验证。最后,我们将图像写入响应的输出流。

步骤4:在JSP页面中显示验证码

要在JSP页面中显示验证码,您可以使用以下代码:

<img src="captcha" alt="Captcha Image" />

这将在页面上显示生成的验证码图像。用户可以查看并输入验证码。

步骤5:验证用户输入

为了验证用户输入的验证码是否正确,您需要在提交表单时进行检查。通常,用户的输入将与存储在Session中的验证码进行比较。

以下是一个示例JSP表单,用户可以在其中输入验证码:

<form action="login" method="post"><label for="username">Username:</label><input type="text" name="username" id="username" required><br><label for="password">Password:</label><input type="password" name="password" id="password" required><br><label for="captcha">Captcha:</label><input type="text" name="captcha" id="captcha" required><img src="captcha" alt="Captcha Image" /><br><input type="submit" value="Login">
</form>

步骤6:验证用户输入

在处理登录请求时,您可以验证用户输入的验证码是否与存储在Session中的验证码匹配。以下是一个示例Servlet,用于处理登录请求和验证验证码:

@WebServlet("/login")
public class LoginServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");String password = request.getParameter("password");String enteredCaptcha = request.getParameter("captcha");HttpSession session = request.getSession();String storedCaptcha = (String) session.getAttribute("captcha");if (enteredCaptcha != null && enteredCaptcha.equals(storedCaptcha)) {// 验证码正确,继续处理登录if ("admin".equals(username) && "password".equals(password)) {// 登录成功response.getWriter().write("Login successful");} else {// 登录失败response.getWriter().write("Login failed");}} else {// 验证码错误response.getWriter().write("Invalid captcha");}}
}

在此示例中,我们首先从用户请求中获取用户名、密码和输入的验证码。然后,我们检查输入的验证码是否与存储在Session中的验证码匹配。如果验证码正确,我们继续验证用户名和密码。如果一切都正确,用户将获得成功的消息。否则,他们将收到适当的错误消息。

总结

验证码是Web应用程序中常用的安全工具,用于防止自动化机器人攻击。通过实现字符验证码,您可以有效地保护您的应用程序免受恶意活动的影响。

在本文中,我们介绍了如何使用Java Servlet技术创建和显示验证码图像,以及如何在用户登录时验证用户的输入。这只是验证码实现的一个示例,您可以根据需要进行自定义和扩展。希望这篇文章能帮助您实现验证码功能,提高您Web应用程序的安全性。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

相关文章:

【Java 进阶篇】Java Web开发:实现验证码功能

在Web应用程序中&#xff0c;验证码&#xff08;CAPTCHA&#xff09;是一种常见的安全工具&#xff0c;用于验证用户是否为人类而不是机器。验证码通常以图像形式呈现&#xff0c;要求用户在登录或注册时输入正确的字符。在这篇文章中&#xff0c;我们将详细介绍如何在Java Web…...

C++启动线程的方法

&#xff08;1&#xff09;函数指针 情况一&#xff1a;主线程有join&#xff0c;正常执行 #include <thread> #include <iostream>void work(int num) {while(num-- > 0) {std::cout << num << std::endl;} }int main() {std::thread t(work, 5);…...

Distilling the Knowledge in a Neural Network学习笔记

1.主要内容是什么&#xff1a; 这篇论文介绍了一种有效的知识迁移方法——蒸馏&#xff0c;可以将大型模型中的知识转移到小型模型中&#xff0c;从而提高小型模型的性能。这种方法在实际应用中具有广泛的潜力&#xff0c;并且可以应用于各种不同的任务和领域。 论文中首先介绍…...

JVM虚拟机:垃圾回收算法和垃圾回收器之间的关系

GC垃圾回收算法 在前面的课程中我们学习了GC垃圾回收算法,分别为: 引用回收算法 复制算法 标记清除算法 标记整理算法 这些垃圾回收算法是理论,有多种垃圾回收器可以实现这些理论。目前为止没有最完美的垃圾回收器,只能针对具体的情况选择最合适的垃圾回收器,进行分代收集…...

oracle sqlplus的使用 ,查询oracle实例名和服务名,查询oracle容器,切换oracle容器

Oracle的sqlplus是与oracle数据库进行交互的客户端工具&#xff08;oracle数据库自带的客户端工具&#xff09;&#xff0c;借助sqlplus可以查看、修改数据库记录。在sqlplus中&#xff0c;可以运行sql*plus命令与sql语句。 1。先使用root账户登陆系统后&#xff0c;使用su - o…...

golang工程——opentelemetry简介、架构、概念、追踪原理

opentelemetry 简介 OpenTelemetry&#xff0c;简称OTel&#xff0c;是一个与供应商无关的开源可观测性框架&#xff0c;用于检测、生成、收集和导出 遥测数据&#xff0c;如轨迹、度量、日志。OTel的目标是提供一套标准化的供应商无关SDK、API和工具&#xff0c;用于接 收、…...

Python 自动化(十六)静态文件处理

准备工作 将不同day下的代码分目录管理&#xff0c;方便后续复习查阅 (testenv) [rootlocalhost projects]# ls day01 day02 (testenv) [rootlocalhost projects]# mkdir day03 (testenv) [rootlocalhost projects]# cd day03 (testenv) [rootlocalhost day03]# django-admi…...

C#学习系列之密闭类、接口、结构和类

C#学习系列之密闭类、接口、结构和类 啰嗦密闭类接口结构和类总结 啰嗦 基础学习 密闭类 类似string这种不想再继续继承和修改下去&#xff0c;使用sealed声明。 派生类中用sealed和override&#xff0c;无法继续重写。 接口 接口就是指定一组函数成员&#xff0c;而不实现…...

C++特殊类的设计

文章目录 设计一个类不能被拷贝请设计一个类&#xff0c;只能在堆上创建对象设计一个类只能在栈上去创建对象设计一个类不能被继承设计一个类&#xff0c;只能创建一个对象(单例模式)饿汉模式懒汉模式 单例模式总结饿汉模式懒汉模式 设计一个类不能被拷贝 拷贝一个类对象可以有…...

量化交易Copula建模应对市场低迷

一、简介 传统上,我们依靠相关矩阵来理解资产间的动态。然而,正如过去的市场崩盘所表明的那样,当风暴袭来时,许多模型都会陷入混乱。突然之间,相关性似乎趋于一致,而多样化这一经常被吹捧的风险管理口号似乎并没有提供什么庇护。 这种出乎意料的同步,即资产在经济低迷时…...

美创科技位居IDC MarketScape:中国数据安全管理平台市场「领导者」类别

近日&#xff0c;IDC发布《IDC MarketScape: 中国数据安全管理平台2023年厂商评估》 报告&#xff0c;报告从交付、产品特性、创新能力、研发速度、客户满意度等多个维度对国内厂商进行全面评估。美创科技列为『领导者』类别&#xff01; ◼︎ 报告中&#xff0c;从关键战略指…...

Go语言变量的使用

基本语法——变量 一、变量的使用 1.1 什么是变量 变量是为存储特定类型的值而提供给内存位置的名称。在go中声明变量有多种语法。 所以变量的本质就是一小块内存&#xff0c;用于存储数据&#xff0c;在程序运行过程中数值可以改变 1.2 声明变量 var名称类型是声明单个变…...

在vitis中bit位赋值如何优化到一拍完成

使用vitis实现硬件代码时&#xff0c;经常遇到不是整拍对齐的情况&#xff0c;比如&#xff1a; ap_uint<128> a; ap_uint<64> b[10]; int pad,pos; /// 计算pos,pad ..... a(pos-1,0) b[pad](63,pos); a(63pos,pos) b[pad1]; a(127,64po…...

深度学习入门(二)之 简单手写数字识别实现

文章目录 引入MINIST数据脚本读入MNIST数据神经网络推理处理批处理 引入MINIST数据脚本 load_mnist为重要关注函数 params&#xff1a; normalize : 将图像的像素值正规化为0.0~1.0 one_hot_label : one_hot_label为True的情况下&#xff0c;标签作为one-hot数组返回 one-hot数…...

USART HMI串口屏+单片机通讯上手体验

USART HMI串口屏单片机通讯上手体验 &#x1f516;本文采用淘晶驰4.3寸IPS串口屏实物验证&#xff0c;HMI串口屏经简单配置即可快速实现&#xff0c;串口通讯效果。串口屏上手简单&#xff0c;有独立的开发套件&#xff0c;容易上手&#xff0c;驱动显示和功能代码独立。本文仅…...

Linux进程概念(1)

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容为进程的概念做铺垫&#xff0c;主要介绍冯诺依曼体系结…...

uniapp 查看安卓第三方插件抛出的异常

0.安装好andriod studio 和hbuilder 1.配置环境变量 鼠标右键此电脑-》设置》关于》高级系统设置》环境变量》系统变量》path中加入 具体的hbuildr adb目录看个人 2.在cmd中输入命令adb version 查看是否配置成功 出现版本号就是配置成功了 3.去hbuilder中&#xff0c;导航栏运…...

美妆造型教培服务预约小程序的作用是什么

美业市场规模很高&#xff0c;细分类目更是比较广&#xff0c;而美妆造型就是其中的一类&#xff0c;从业者也比较多&#xff0c;除了学校科目外&#xff0c;美妆造型教培机构也有生意。 对机构来说主要目的是拓客引流-转化及赋能&#xff0c;而想要完善路径却是不太容易&…...

Pytorch常用函数

Pytorch 1 一些操作含义2 常用函数torch.squeezetorch.unsqueezetorch.transpose随机数生成Tensor详细内容 1 一些操作含义 下划线后缀含义&#xff1a; 在touch中函数后面加下划线代表是原位(In-place)操作&#xff0c;也就是内存的位置不变化&#xff0c;比如torch.add(valu…...

如何利用python连接讯飞的星火大语言模型

星火大模型是科大讯飞推出的一款人工智能语言模型&#xff0c;它采用了华为的昇腾910 AI处理器。这款处理器是一款人工智能处理器&#xff0c;具有强大的计算能力和高效的能耗控制能力。 华为昇腾910 AI处理器采用了创新的Da Vinci架构&#xff0c;这种架构在设计上充分考虑了…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...