生成验证码图片的Java代码

文章目录

  • 验证码演示代码
  • 请求资源路径为什么要添加一个随机数的参数

验证码演示代码

package priv.lwx.javaex.servlet_demo.web.servlet.response;import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;/*** 验证码示例代码** @author liaowenxiong* @date 2022/1/10 11:01*/
@WebServlet("/check_code")
public class CheckCodeServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {int width = 100; // 表示图片的宽度,单位像素int height = 50; // 表示图片的高度,单位像素// 1.创建一个图片对象,代表内存中的验证码图片。图片对象创建好之后,就表示在内存中创建了一个图片(内存中存储的是二进制数据),图片背景色默认黑色BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);// 2.美化图片// 2.1.填充背景色// 先获取画笔Graphics graphics = image.getGraphics();// 设置画笔的颜色为粉红色graphics.setColor(Color.PINK);// 填充矩形graphics.fillRect(0, 0, width, height);// 2.2.画边框// 设置画笔的颜色为蓝色graphics.setColor(Color.BLUE);// 画边框graphics.drawRect(0, 0, -1, height - 1);// 画随机字符// 随机字符的来源String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";// 创建随机数对象Random ran = new Random();// 2.3.画随机字符。循环四次,画4个随机的字符for (int i = 1; i <= 4; i++) {// 生成随机的字符串下标int index = ran.nextInt(str.length());// 获取随机字符char c = str.charAt(index);// 画随机字符graphics.drawString(c + "", width / 5 * i, height / 2);}// 2.4.画干扰线// 设置画笔的颜色为绿色的graphics.setColor(Color.GREEN);// 获取随机的for (int i = 0; i < 10; i++) {// 获取两个随机点的坐标值int x1 = ran.nextInt(width);int x2 = ran.nextInt(width);int y1 = ran.nextInt(height);int y2 = ran.nextInt(height);// 画线graphics.drawLine(x1, y1, x2, y2);}// 3.将图片输出到Response对象的字节流中ImageIO.write(image, "jpg", resp.getOutputStream());}
}

请求资源路径为什么要添加一个随机数的参数

由于浏览器的缓存机制,发送的请求资源路径如果与上一次相同,有的浏览器不会再向服务器发送请求。

解决方案:
采用一种“欺骗”手段向服务发送请求。就是给请求资源路径增加一个参数,参数值是一个随机数,那么就可以制造假象,使得每次发送的请求地址不同。其实服务器端的 Servlet 每次处理请求时,并没有用到该参数,只是为了给浏览器制造假象罢了。

例如:

img.src="/servlet_demo/check_code?" + Math.random();

或者

img.src = "/servlet_demo/check_code?" + date;

前端示例代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>注册界面</title><script>window.onload = function () {var img = document.getElementById("checkCode");var link = document.getElementById("changeCode");// 给图片元素注册点击事件监听器img.onclick = function () {var date = new Date().getTime();img.src = "/servlet_demo/check_code?" + date;}// 给超链接注册点击事件监听器link.onclick = function () {var date = new Date().getTime();img.src = "/servlet_demo/check_code?" + date;}}</script>
</head>
<body>
<form action="/servlet_demo/request-demo06" method="get"><input type="text" placeholder="请输入用户名" name="userName"/><br><input type="text" placeholder="请输入密码" name="password"/><br><input type="text" placeholder="请输入验证码" name="checkCode"/><img id="checkCode" src="/servlet_demo/check_code"/><a id="changeCode" href="javascript:void(0);">看不清楚换一张?</a><br><input type="submit" value="提交"/>
</form></body>
</html>

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

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

相关文章

线程同步 线程安全_同步装饰器来替换线程安全类

线程同步 线程安全您知道什么是线程安全吗&#xff1f; 如果没有&#xff0c;下面是一个简单的示例。 所有类都必须是线程安全的&#xff0c;对吗&#xff1f; 并不是的。 其中一些必须是线程安全的&#xff1f; 又错了。 我认为它们都不必是线程安全的&#xff0c;而它们都必须…

python数学要求_python数学工具之积分(1)

加载库Polygon&#xff0c;绘制积分图形。 fig, ax plt.subplots(figsize(7, 5))表示绘图尺寸为7*5&#xff1b;plt.plot(x, y, b, linewidth2)表示绘制蓝色线宽为2的函数图形&#xff1b;plt.ylim(ymin0)表示y轴最小值为0&#xff1b;Ix np.linspace(a, b)表示lx取值范围为[…

linux swap分区与内存,虚拟内存和swap分区的关系

首先&#xff0c;这两个概念分别对应windows和linux&#xff0c;即&#xff1a;windows&#xff1a;虚拟内存linux&#xff1a;swap分区windows即使物理内存没有用完也会去用到虚拟内存&#xff0c;而Linux不一样 Linux只有当物理内存用完的时候才会去动用虚拟内存(即swap分区)…

.net2.0 orm_Java 8:深入研究速度3.0.1“森林”流ORM

.net2.0 orm沿着这条路 我一直在为开源项目Speedment &#xff08;它是Stream ORM Java工具包和运行时&#xff09;做出贡献&#xff0c;并且刚刚发布了一个新的主要版本3.0.1“ Forest”。 版本的发布是以加利福尼亚帕洛阿尔托的大街小巷命名&#xff0c;大多数贡献者都在此工…

JavaScript/JS如何给元素对象添加事件

使用普通的 js 代码给元素对象添加事件 绑定事件&#xff0c;添加事件处理程序&#xff1a; var obj document.getElementById("name"); obj.onclick f1; function f1(){ alert("hello!"); }说明&#xff1a;函数名 f1 就是一个引用数据类型的变量&…

forge开发_使用Forge,WildFly Swarm和Arquillian开发微服务

forge开发在这篇文章中&#xff0c;我们将看到如何使用WildFly Swarm和Forge开发微服务&#xff0c;以及如何使用Arquillian和Rest Assured对其进行测试。 WildFly Swarm提供了一种创新的方法来打包和运行Java EE应用程序&#xff0c;方法是将它们与足够的服务器运行时一起打包…

zynq+linux固化程序,如何在 Zynq UltraScale+ MPSoC 上实现 Linux UIO 设计

原标题&#xff1a;如何在 Zynq UltraScale MPSoC 上实现 Linux UIO 设计简介作者&#xff1a; Alex He (何晔)&#xff0c; 赛灵思高级嵌入式应用工程师这里的 UIO 即 Userspace I/O&#xff0c;本文中 UIO 泛指 UIO 设备和 UIO 驱动。它在 Linux kernel 的世界里比较小众&…

python初学者代码示例_Selenium 快速入门笔记和代码示例(Python版)

链接 文档链接&#xff1a; 安装 selenium 模块和 Chrome 浏览器驱动 步骤&#xff1a; 安装 Selenium 模块&#xff1a; pip install selenium 下载浏览器驱动&#xff08;下载即可&#xff0c;无需安装&#xff0c;使用时要指定它的路径&#xff09;&#xff1a;请参考 https…

用例描述

用例名称&#xff1a;简要说明/描述&#xff0c; 优先级&#xff1a; 参与者&#xff1a; 事件流&#xff1a;就是用例执行时&#xff0c;由一序列活动组成的控制流。 基本事件流&#xff1a;对用例中常规、预期路径的描述。 扩展事件流&#xff1a;主要是对一些异常情况、选…

thinkpad笔记本散热风扇_极致的散热体验,ORICO 全铝DIY双风扇笔记本散热垫评测...

电脑的出现&#xff0c;极大的改变了人类的生活。娱乐、办公、游戏、电子竞技等等都需要用到电脑。而电脑也慢慢的在升级着。电脑的体积也由最开始的的占据几间屋子的庞大体积&#xff0c;到后来的台式机、台式一体机、电脑的体积慢慢的变的越来越小。而便携式笔记本电脑的出现…

清除java_如何在Java地毯下有效地清除问题

清除java因为软件错误可能使我们在开发人员面前看起来很糟糕&#xff0c;并导致其他人对我们的想法减少&#xff0c;所以最好避免编写错误&#xff0c;快速识别和修复错误或掩盖我们的错误。 有许多博客文章和文章讨论如何避免错误以及如何识别和修复错误&#xff0c;因此&…

Web产品的交互说明文档应该怎么写?

经常与开发同学聊天&#xff0c;他们说有一个详细的说明文档可以帮助他们更准确的进行工时评估&#xff0c;还可以帮助他们提高工作效率&#xff0c;减少多余的思考时间。因此在这里分享一些制作交互说明文档的经验。 我先说说说交互原型包含哪些部分&#xff1f; 版本说明及更…

linux类似360软件,linux下有什么类似鲁大师查看电脑配置的软

满意答案drqyna2017.05.26采纳率&#xff1a;40% 等级&#xff1a;11已帮助&#xff1a;5455人linux如何查看系统的硬件配置如何在linux系统下查看系统配置&#xff1f;在图形模式下我们可以很方便的利用Linux的图形工具&#xff0c;点击几下就可以查看到Linux系统的的硬件信…

java 编写代码_如果您在2016年编写过Java代码-这是您不容错过的趋势

java 编写代码2016年最有趣的Java相关主题 关于代码&#xff0c;有很多热门话题&#xff0c;而要跟上所有事情&#xff0c;这是一项全职的工作。 如果您想知道如何从谷壳中分离出小麦&#xff0c;我们已经为您完成了工作。 在下面的文章中&#xff0c;我们将介绍2016年最热门…

thinkphp json_原创干货 | Thinkphp序列化合总

听说转发文章会给你带来好运最近Thinkphp几个版本都出了反序列化利用链&#xff0c;这里集结在一起&#xff0c;下面是复现文章&#xff0c;poc会放在最后01Thinkphp5.1.37环境搭建composercreate-project topthink/think5.1.37 v5.1.37poc演示截图调用链单步调试漏洞起点在\th…

linux安java,Linux安装Java

从人类社会的角度看OO&lpar;独家视角&rpar;引言 在OO的工作中,我们一定会涉及到类,抽象类和接口.那么类和抽象类以及接口到底扮演的什么角色? 本文主要是从人类社会的角度阐述类与抽象类以及接口的"社会"关系,从而让我们抛弃书 ...include与require的区别&a…

前端和后端的区别

后端工程师负责服务器端应用程序的编写开发&#xff08;业务逻辑、方法、函数、数据库代码等&#xff09; 前端工程师负责UI的html代码编写和设计&#xff0c;所以前端工程师一般指网页工程师 前端部分是和用户直接交互的&#xff0c;包括前台和后台部分 客户端其实就是属于前端…

笔记本能安装联想智能云教室吗_挑战Jupyter Notebook:云协作、云硬件,上云的Notebook编程环境...

对全世界的 Python 高手而言&#xff0c;Jupyter Notebook 是目前最流行的编程环境&#xff0c;但它也有一些令人难以忍受的缺点。为此&#xff0c;一个位于旧金山的小团队开发了一款名为 Deepnote 的笔记本工具&#xff0c;这是一种云协作、云硬件&#xff0c;上云的 Notebook…

java自动生成类_自动生成优化的Java类专业知识

java自动生成类如果您今年访问过JavaOne&#xff0c;您可能已经参加了我的演讲“如何从数据库生成定制的Java 8代码”。 在那次演讲中&#xff0c;我展示了如何使用Speedment Open Source工具包使用数据库作为域模型来生成各种Java代码。 我们没有时间要考虑的一件事是&#xf…

在Linux中su和sudo区别,Linux中su和sudo的用法和区别

目录sudosudo&#xff1a;暂时切换到超级用户模式以执行超级用户权限&#xff0c;提示输入密码时该密码为当前用户的密码&#xff0c;而不是超级账户的密码。缺点是每次执行超级用户权限都要在命令前加上 sudo &#xff0c;优点是在当前终端再使用 sudo 不要再重复输入密码(只对…