【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

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

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

相关文章

软件开发全文档归档,开发、管理、实施、运维、服务巡检、信息安全、安全运维

在当今高度信息化的时代&#xff0c;软件开发已成为推动社会进步和发展的重要力量。软件开发过程中&#xff0c;文件支撑作为关键的一环&#xff0c;对于保障项目的顺利进行和产品的质量具有不可替代的作用。本文将探讨软件开发所需的主要文件及其作用。 一、引言 软件开发是…

AI时代,ChatGPT与文心一言选哪一个?

&#x1f388;个人公众号:&#x1f388; :✨✨✨ 可为编程✨ &#x1f35f;&#x1f35f; &#x1f511;个人信条:&#x1f511; 为与不为皆为可为&#x1f335; 你们平时都是在什么情况下使用GPT的呢&#xff1f;为何使用&#xff1f;都使用什么平台的&#xff1f; 针对以上问…

算法刷题-二叉树3

算法刷题-二叉树 3 116. 填充每个节点的下一个右侧节点指针 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; }填充它的每个 next 指…

UG NX机械设计软件常见安装问题

UG软件版本这里咱们就不提了&#xff0c;大部分伙伴应该都是钩子激活软件&#xff0c;肯定会遇到或多或少的安装问题&#xff0c;今天这里给大家总结了下&#xff0c;需要的小伙伴自取。 有其他问题可以一起讨论&#xff0c;也希望看到的小伙伴多关注支持哦。 安装UGNX的必要…

如何使用drawio画流程图以及导入导出

画一个基本的流程图 你可以在线使用drawio, 或者drawon创建很多不同类型的图表。 如何使用编辑器&#xff0c;让我们以一个最基本的流程图开始。 流程图&#xff0c;就是让你可视化的描述一个过程或者系统。 图形和很少部分的文字表达就可以让读者很快的理解他们需要什么。 创…

Android 优质的UI组件汇总

1、RuleView &#xff1a;Android自定义标尺控件(选择身高、体重等) 链接&#xff1a;https://github.com/cStor-cDeep/RuleView 2、DashboardView &#xff1a;Android自定义仪表盘View&#xff0c;仿新旧两版芝麻信用分、炫酷汽车速度仪表盘 链接&#xff1a;https://git…

Fabric二进制添加对等节点

目录 一、准备peer11.1、注册peer11.2、登记peer11.3、登记peer1的tls 二、启动peer1三、添加peer1到应用通道四、链码安装和调用 书接上回&#xff0c;在 Fabric二进制建链的基础上&#xff0c;继续通过二进制命令行的方式&#xff0c;添加一个新的对等节点peer1。 一、准备p…

【设计模式】第17节:行为型模式之“解释器模式”

一、简介 解释器模式为某个语言定义它的语法&#xff08;或者叫文法&#xff09;表示&#xff0c;并定义一个解释器用来处理这个语法。 二、适用场景 领域特定语言复杂输入解释可扩展的语言结构 三、UML类图 四、案例 对输入的特定格式的打印语句进行解析并执行。 packag…

node使用path模块的基本使用

文章目录 一、path.resolve(常用)二、path.sep三、path.parse其他 一、path.resolve(常用) 由于node 中使用 __dirname 获取的绝对路径是/ ,而我们拼接的路径为‘/’导致路径不统一。 作用&#xff1a;拼接规范的绝对路径 const fs require(fs) const path require(path)// 1…

使用复合机器人有哪些注意事项

随着科技的快速发展&#xff0c;复合机器人在各个领域得到了广泛应用。复合机器人可以完成多种任务&#xff0c;具备高效、精准、灵活等优势。然而&#xff0c;在使用复合机器人时&#xff0c;我们也需要注意一些事项&#xff0c;以确保安全和有效地使用这些机器人。 一、安装要…

怎么让照片内存变小?三个方法轻松搞定!

让照片内存变小可以节省存储空间、提高传输速度、优化图片质量和降低流量消耗等&#xff0c;对于设备性能和用户体验都有积极的影响。下面介绍了三种简单有效的方法&#xff0c;一起来看看吧~ 方法一&#xff1a;通过嗨格式压缩大师压缩照片让内存变小 通过压缩照片&#xff0…

快速了解ClickHouse!

简介 ClickHouse是一个开源列式数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;用于在线分析处理&#xff08;OLAP&#xff09;&#xff1a; 列式存储&#xff1a;与传统的行式数据库不同&#xff0c;ClickHouse以列的形式存储数据&#xff0c;这使得在分析大量数据时…

软考之精读真题解析

1、假设系统中有n个进程共享3台打印机&#xff0c;意味着每次只允许3个进程进入互斥段&#xff0c;那么信号量的初值应为3。信号量的范围是3&#xff0c;2&#xff0c;1&#xff0c;0&#xff0c;-1&#xff0c;…&#xff0c;-(n-3)。此时&#xff0c;信号量的物理意义为&…

大长案例 - 经典长连接可水平扩容高可用架构

文章目录 需求设计 需求 支撑百万充电桩充电业务的长连接可水平扩容高可用架构需求如下&#xff1a; 可扩展性&#xff1a;系统应该具备高度可扩展性&#xff0c;能够轻松应对新增充电桩的需求。任何时候都应该容易添加更多的充电桩&#xff0c;而不会影响整体性能。 负载均衡…

网课搜题小程序源码/小猿题库多接口微信小程序源码+自带流量主

网课搜题小程序源码&#xff0c;多接口小猿题库等综合网课搜题微信小程序源码带流量主&#xff0c;网课搜题小程序&#xff0c;可以开通流量主赚钱。 搭建教程 1、微信公众平台注册自己的小程序 2、下载微信开发者工具和小程序的源码 3、上传代码到自己的小程序 下载地址&…

kubesphere部署尚医通

项目架构 yygh-parent |---common //通用模块 |---hospital-manage //医院后台 [9999] |---model //数据模型 |---server-gateway //网关 [80] |---service …

Reading:Deep dive into the OnPush change detection strategy in Angular

原文连接&#xff1a;IndepthApp 今天深入阅读并总结Angualr中onPush更新策略。 1. 两种策略 & whats Lview&#xff1f; Angular 实现了两种策略来控制各个组件级别的更改检测行为。这些策略定义为Default和OnPush&#xff1a; 被定义为枚举&#xff1a; export enum…

Microsoft SQL Server 缓冲区错误漏洞(CVE-2018-8273)解决方法

前言&#xff1a; 在一次漏洞扫描中&#xff0c;扫描出紧急漏洞Microsoft SQL Server 缓冲区错误漏洞(CVE-2018-8273) 根据修复建议找补丁。 一、漏洞详情 二、寻找补丁 根据漏洞修复建议去下载补丁 目前厂商已发布升级补丁以修复漏洞&#xff0c;补丁获取链接&#xff1a;h…

CSS中实现元素居中的几种方法总结

一、使用 text-align: center 居中 使用 text-align: center; 可以在CSS中实现内联元素的水平居中。这个技术利用了CSS的 text-align 属性&#xff0c;通过对元素的文本对齐方式进行调整来实现居中效果。注&#xff1a;只展示主要代码。 <div class"container"&…

Unity-UV展开工具

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor;public class unfold : EditorWindow {[MenuItem("Gq_Tools/展开")]public static void ShowWin(){EditorWindow.CreateInstance<unfold>().Show();}priva…