后端java——如何为你的网页设置一个验证码

目录

1、工具的准备

2.基本方法

3.实现类

4.实践

HTML文件:

 Java文件1:创建验证码

 Java文件2:验证验证码


本文通过HUTOOL实现:Hutool参考文档Hutool,Java工具集icon-default.png?t=O83Ahttps://hutool.cn/docs/#/

1、工具的准备

如果我们通过hutool来实现这个功能,我们需要提前安装hutool的jar包。

下载地址:Central Repository: cn/hutool/hutool-all/5.8.16 

将下载好的jar包放到eclipse的lib目录,我们project所有的jar包在这里放置:

 至此,工具准备完毕。

2.基本方法

在hutool里,验证码功能位于cn.hutool.captcha包中,核心接口为ICaptcha,此接口定义了以下方法:

  • createCode 创建验证码,实现类需同时生成随机验证码字符串和验证码图片
  • getCode 获取验证码的文字内容
  • verify 验证验证码是否正确,建议忽略大小写
  • write 将验证码写出到目标流中

 其中write方法只有一个OutputStreamICaptcha实现类可以根据这个方法封装写出到文件等方法。

3.实现类

1.LineCaptcha线段干扰的验证码(Java)

//定义图形验证码的长和宽
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);//图形验证码写出,可以写出到文件,也可以写出到流
lineCaptcha.write("d:/line.png");
//输出code
Console.log(lineCaptcha.getCode());
//验证图形验证码的有效性,返回boolean值
lineCaptcha.verify("1234");//重新生成验证码
lineCaptcha.createCode();
lineCaptcha.write("d:/line.png");
//新的验证码
Console.log(lineCaptcha.getCode());
//验证图形验证码的有效性,返回boolean值
lineCaptcha.verify("1234");

验证码图片会输出的上面代码中定义的路径("d:/line.png"),效果如下: 

2.CircleCaptcha圆圈干扰的验证码(Java) 

//定义图形验证码的长、宽、验证码字符数、干扰元素个数
CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 20);
//CircleCaptcha captcha = new CircleCaptcha(200, 100, 4, 20);
//图形验证码写出,可以写出到文件,也可以写出到流
captcha.write("d:/circle.png");
//验证图形验证码的有效性,返回boolean值
captcha.verify("1234");

效果如下:

3.ShearCaptcha扭曲干扰验证码

//定义图形验证码的长、宽、验证码字符数、干扰线宽度
ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(200, 100, 4, 4);
//ShearCaptcha captcha = new ShearCaptcha(200, 100, 4, 4);
//图形验证码写出,可以写出到文件,也可以写出到流
captcha.write("d:/shear.png");
//验证图形验证码的有效性,返回boolean值
captcha.verify("1234");

效果如下:

4.写出到浏览器输出 (servlet)

html:(在图片src传入)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><img alt="" src="Test"></body>
</html>

servlet(get请求): 

ICaptcha captcha = ...;
captcha.write(response.getOutputStream());
//Servlet的OutputStream记得自行关闭哦!

  注意:servlet自己的output stream要关闭

4.实践

我们来实现一个让用户输入验证码,判断是否正确。

HTML文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">div{background: #e8f2fe;}img{height:25px;width:90px;}input{height:25px;width:120px;text-align: center;}.btn{width:50px;padding:3px;cursor: pointer;background: #ddd;}
</style>
<script type="text/javascript">$(function(){$(".btn").on("click",function(){//获取输入框中的用户输入var input=$(".captcha").val().trim()//切入后端$.ajax({url:"Login", //请求路径type:"get", //请求方式data:{input},success:function(value){alert(value)//刷新location.reload()},error:function(){alert("请求失败!")}})})
})
</script>
</head>
<body><div class="yzm"><h3>登录</h3><input type="text" placeholder="请输入验证码" class="captcha"><img src="Test" alt="" onclick="this.src=this.src+'?'"> <input type="button" value="登录" class="btn" >          </div></body>
</html>

对于验证码的处理,我设置了验证码点击更新的功能:

 <img src="Test" alt="" onclick="this.src=this.src+'?'"> 

  onclick="this.src=this.src+'?'" 属性是一个事件处理器,它定义了当用户点击图片时应该执行的动作。在这个例子中,当图片被点击时,它的 src 属性会被修改为当前的值加上一个问号(get请求申请),使浏览器重新加载图片。

        同时也连接了Login.java SERVLET

<script type="text/javascript">$(function(){$(".btn").on("click",function(){//获取输入框中的用户输入var input=$(".captcha").val().trim()//切入后端$.ajax({url:"Login", //请求路径type:"get", //请求方式data:{input},success:function(value){alert(value)//刷新location.reload()},error:function(){alert("请求失败!")}})})
})
</script>

 Java文件1:创建验证码
// 定义一个处理GET请求的doGet方法  
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  // 创建一个圆形验证码对象,指定宽度为200像素,高度为100像素,字符数为4,干扰线数为20  CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 20);  // 将验证码的图像数据写入到响应的输出流中,这样客户端就可以接收到并显示验证码图像  captcha.write(response.getOutputStream());  // 获取当前请求的会话(如果会话不存在,则创建一个新的会话)  HttpSession session = request.getSession(true);    // 将会话中的"captchaCode"属性设置为验证码的字符序列,以便后续验证用户输入的验证码是否正确  // 这里captcha.getCode()返回的是验证码图像中显示的字符序列  session.setAttribute("captchaCode", captcha.getCode());    
}

  1. doGet方法:这是一个Servlet中处理HTTP GET请求的方法。当客户端(如浏览器)发送一个GET请求到服务器时,这个方法会被调用。

  2. 创建验证码:通过调用CaptchaUtil.createCircleCaptcha方法创建一个圆形验证码对象。这个方法接受四个参数:验证码图像的宽度、高度、字符数和干扰线数。

  3. 发送验证码到客户端:通过调用captcha.write方法,将验证码的图像数据写入到响应的输出流中。这样,当这个Servlet被访问时,客户端(如浏览器)就可以接收到并显示这个验证码图像。

  4. 获取会话:通过调用request.getSession(true)获取当前请求的会话。如果会话不存在,则创建一个新的会话。这里的true参数表示如果会话不存在,则创建一个新的会话。

  5. 保存验证码到会话:通过调用session.setAttribute方法,将会话中的"captchaCode"属性设置为验证码的字符序列。这样,在后续处理用户提交的表单时,可以从会话中获取这个验证码,并与用户输入的验证码进行比较,以验证用户输入的正确性。

 Java文件2:验证验证码
// 定义一个处理GET请求的doGet方法  
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  // 设置请求和响应的字符编码为UTF-8,以支持中文等多字节字符集  request.setCharacterEncoding("utf-8");  response.setCharacterEncoding("utf-8");  // 从请求中获取名为"Catchcode"的参数值,这通常是用户在表单中输入的值  String input = request.getParameter("captchaCode");  // 获取当前请求的会话对象,如果会话不存在,则创建一个新的会话  HttpSession session = request.getSession();  // 从会话中获取名为"input"的属性值,这通常是在用户提交表单之前设置的正确答案  String answer = (String) session.getAttribute("input");  // 定义一个字符串变量res,用于存储登录结果  String res = "";  // 比较用户输入的值与会话中存储的正确答案  if (input.equals(input)) {  // 如果两者相等,则登录成功  res = "登录成功";  } else {  // 如果不相等,则登录失败  res = "登录失败";  }  // 将登录结果写入到响应的输出流中,这样前端就可以接收到这个结果并显示给用户   response.getWriter().write(res);  
}

 其中:

 // 从会话中获取名为"input"的属性值,这通常是在用户提交表单之前设置的正确答案  String input = (String) session.getAttribute("input");  

(String):这是一个强制类型转换操作。getAttribute方法返回的是一个Object类型的对象,因为会话中的属性值可以是任何类型的对象。在这个例子中我们需要“input“属性存储的是一个字符串类型的值,因此我们需要将它从Object类型强制转换为String类型。

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

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

相关文章

【go从零单排】Strings and Runes 字符串和字符

Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 概念 在Go语言中&#xff0c;rune 是一个内置的数据类型&#xff0c;用于表示一个Unicode字符。它实际上是一个别名…

如何在本地Linux服务器搭建WordPress网站结合内网穿透随时随地可访问

文章目录 前言1. 安装WordPress2. 创建WordPress数据库3. 安装相对URL插件4. 安装内网穿透发布网站4.1 命令行方式&#xff1a;4.2. 配置wordpress公网地址 5. 配置WordPress固定公网地址 前言 本文主要介绍如何在Linux Ubuntu系统上使用WordPress搭建一个本地网站&#xff0c…

vue data变量之间相互赋值或进行数据联动

摘要&#xff1a; 使用vue时开发会用到data中是数据是相互驱动&#xff0c;经常会想到watch,computed&#xff0c;总结一下&#xff01; 直接赋值&#xff1a; 在 data 函数中定义的变量可以直接在方法中进行赋值。 export default {data() {return {a: 1,b: 2};},methods: {u…

在 Java 中使用脚本语言

在 Java 中使用脚本语言&#xff0c;特别是在 Java 平台上集成如 Python、JavaScript 或 Ruby 等语言&#xff0c;通常可以通过 Java 的 Scripting API 来实现。这个 API 基于 JSR 223&#xff08;“Scripting for the Java Platform”&#xff09;&#xff0c;提供了一种标准方…

大数据-212 数据挖掘 机器学习理论 - 无监督学习算法 KMeans 基本原理 簇内误差平方和

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

微服务系列六:分布式事务与seata

目录 实验环境说明 前言 一、分布式事务问题与策略 1.1 分布式事务介绍 1.2 分布式事务解决策略分析 二、分布式事务解决方案 Seata 2.1 认识Seata 2.2 Seata的工作原理 2.3 部署Seata微服务 2.3.1 准备数据库表 2.3.2 准备配置文件 2.3.3 docker部署 2.4 微服务集…

Java 上机实践2(基础数据类型与数组)

&#xff08;大家好&#xff0c;今天分享的是Java的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 实验一&#xff1a;输出希腊字母表 一、实验目的 二、实验要求 三、程序代码 四、实验结果 实验二&#xff1a;…

w024基于SpringBoot的企业客户管理系统的设计与实现

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0…

并发编程volatile精解

多线程下变量的不可见性 在多线程并发执行的情况下&#xff0c;多个线程修改共享的成员变量&#xff0c;会出现一个线程修改了共享变量的值后&#xff0c;另一个线程不能直接看到该线程修改后的变量最新值。(多线程下修改共享变量会出现变量修改值后的不可见性) 可见性问题…

十款外贸软件盘点,专注企业订单业务管理

在当今全球化的市场环境中&#xff0c;外贸企业的发展面临着诸多挑战与机遇。如何高效管理企业业务&#xff0c;提升运营效率&#xff0c;成为外贸企业在激烈竞争中脱颖而出的关键。外贸业务管理ERP软件作为一种强大的工具&#xff0c;能够整合企业资源、优化管理流程、实现数据…

yaml文件编写

Kubernetes 支持YAML和JSON格式管理资源 JSON 格式:主要用于 api 接口之间消息的传递 YAML 格式;用于配置和管理,YAML是一种简洁的非标记性语言,内容格式人性化容易读懂 一&#xff0c;yaml语法格式 1.1 基本语法规则 使用空格进行缩进&#xff08;不使用制表符&#xff0…

Node.js 全栈开发进阶篇

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;node.js篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来node.js篇专栏内容:node.js- 全栈开发进阶篇 前言 大家好&#xff0c;我是青山。在上一篇文章中&#xff0c;…

Vue(JavaScript)读取csv表格并求某一列之和(大浮点数处理: decimal.js)

文章目录 想要读这个表格&#xff0c;并且求第二列所有价格的和方法一&#xff1a;通过添加文件输入元素上传csv完整&#xff08;正确&#xff09;代码之前的错误部分因为价格是小数&#xff0c;所以下面的代码出错。如果把parseFloat改成parseInt&#xff0c;那么求和没有意义…

C语言初阶必会的练习题(3)之位操作符(^ 、、>>等)的应用

C语言初阶必会的练习题&#xff08;3&#xff09; 放在最前面的1、不允许创建临时变量&#xff0c;交换两个整数的内容1.1、分析&#xff1a;见代码注释&#xff08;a&#xff09;方法 1&#xff08;b&#xff09;方法 2 1.2、结果展示方法 1 的 结果&#xff1a;方法 2 的 结果…

基于SSM框架的乡村农户对口扶贫系统

基于SSM框架的乡村农户对口扶贫系统。 设计步骤&#xff1a; 项目架构创建&#xff1a;首先创建项目的基本架构&#xff0c;包括com.zc.xxx路径下的文件和resources资源文件夹。 SSM架构&#xff1a;使用Spring、SpringMVC、MyBatis作为后端架构&#xff0c;采用POJO—Dao—…

微服务透传日志traceId

问题 在微服务架构中&#xff0c;一次业务执行完可能需要跨多个服务&#xff0c;这个时候&#xff0c;我们想看到业务完整的日志信息&#xff0c;就要从各个服务中获取&#xff0c;即便是使用了ELK把日志收集到一起&#xff0c;但如果不做处理&#xff0c;也是无法完整把一次业…

十五:java web(7)-- Spring Boot

目录 1. Spring Boot 简介 1.1 简介 1.2 Spring Boot 的特点 1.3 Spring Boot 和 Spring 的关系 2. Spring Boot 快速入门 2.1 创建第一个 Spring Boot 项目 3. Spring Boot 配置管理 3.1 application.properties 和 application.yml 配置 这两种都可以 好像现在更推荐…

关于打开网页非常慢的解决方法

方法一&#xff1a;刷新dns缓存 ipconfig /flushdns方法二&#xff1a;许多网站&#xff0c;太落后&#xff0c;不支持ipv6&#xff0c;所以关闭ipv6即可

JDK1.5 java代码打包jar HmacSha256

文章目录 demo地址背景实现编写代码编译class文件打包 JAR 文件执行生成的 JAR 文件辅助验证方式 常见问题和解决方法常规生成jar方案maven插件idea工具 demo地址 https://github.com/xiangge-zx/HmacSha256 背景 最近接到一个需求,做一个可以用来HmacSha256加密的小工具&am…

Go八股(Ⅳ)***slice,string,defer***

***slice&#xff0c;string&#xff0c;defer*** 1.slice和arry的区别 arry&#xff1a; Go语言中arry即为数据的一种集合&#xff0c;需要在声明时指定容量和初值&#xff0c;且一旦声明就长度固定&#xff0c;访问时按照索引访问。通过内置函数len可以获取数组中的元素个…