java实现验证码

Java实现图形验证码 本文生成图像验证码使用了Hutool官网 — 🍬A set of tools that keep Java sweet.图形验证码是一种用于验证用户身份的安全措施。它通过生成一张包含随机图像和文字的图片,要求用户进行识别并输入正确信息来证明其为真实用户而非计算机程序。旨在防止恶意行为,例如批量注册、登录、灌水等,以提高网站的安全性。图形验证码通常会包含随机生成的数字、字母或符号,并且还会加入一些干扰元素,如曲线、噪点或干扰线,以增加识别难度。 阅读详情

 在开发的系统如果需要使用在外网的,特别要注意有安全措施。验证码就是实现安全常见办法之一,它能防止利用程序对系统进行恶意刷新和自动注册。

 但是随着破解技术加强,简单的注册码很难有用。
 
 以下只是实现简单验证码的java代码
 package com.song.test;
 import java.awt.Color;
  import java.awt.Font;
  import java.awt.Graphics2D;
  import java.awt.image.BufferedImage;
  import java.io.IOException;
  import java.util.Random;
 import javax.imageio.ImageIO;
  import javax.servlet.ServletException;
  import javax.servlet.ServletOutputStream;
  import javax.servlet.http.HttpServlet;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import javax.servlet.http.HttpSession;
 
 /**
 * @Copyright @ 2009 All right reserved
 * @version 创建时间:Created on Apr 15, 2009
 * @author 作者:Create by www.360buyli.com
 * @description 实现简单的验证码
 */
 
  public class RandomCode extends HttpServlet {
  private static final long serialVersionUID = 1L;
         
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
               throws ServletException, IOException { 
     
           this.doPost(request, response); 
       } 
     
       public void doPost(HttpServletRequest request, HttpServletResponse response) 
               throws ServletException, IOException { 
     
           // 验证码图片的宽度。 
           int width = 70; 
           // 验证码图片的高度。 
           int height = 30; 
           BufferedImage buffImg = new BufferedImage(width, height, 
                   BufferedImage.TYPE_INT_RGB); 
           Graphics2D g = buffImg.createGraphics(); 
     
           // 创建一个随机数生成器类。 
           Random random = new Random(); 
     
           // 设定图像背景色(因为是做背景,所以偏淡) 
           g.setColor(getRandColor(200, 250)); 
           g.fillRect(0, 0, width, height); 
           // 创建字体,字体的大小应该根据图片的高度来定。 
           Font font = new Font("Times New Roman", Font.HANGING_BASELINE, 28); 
           // 设置字体。 
           g.setFont(font); 
     
           // 画边框。 
           g.setColor(Color.BLACK); 
           g.drawRect(0, 0, width - 1, height - 1); 
           // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到。 
           //g.setColor(Color.GRAY); 
           g.setColor(getRandColor(160,200)); 
           for (int i = 0; i < 155; i++) { 
               int x = random.nextInt(width); 
               int y = random.nextInt(height); 
               int xl = random.nextInt(12); 
               int yl = random.nextInt(12); 
               g.drawLine(x, y, x + xl, y + yl); 
           } 
     
           // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。 
           StringBuffer randomCode = new StringBuffer(); 
     
           // 设置默认生成4个验证码 
           int length = 4; 
           // 设置备选验证码:包括"a-z"和数字"0-9" 
           String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; 
     
           int size = base.length(); 
     
           // 随机产生4位数字的验证码。 
           for (int i = 0; i < length; i++) { 
               // 得到随机产生的验证码数字。 
               int start = random.nextInt(size); 
               String strRand = base.substring(start, start + 1); 
     
               // 用随机产生的颜色将验证码绘制到图像中。 
               // 生成随机颜色(因为是做前景,所以偏深) 
               //g.setColor(getRandColor(1, 100)); 
                 
               //调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成 
               g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110))); 
     
               g.drawString(strRand, 15 * i + 6, 24); 
     
               // 将产生的四个随机数组合在一起。 
               randomCode.append(strRand); 
           } 
           // 将四位数字的验证码保存到Session中。 
           HttpSession session = request.getSession(); 
           session.setAttribute("rand", randomCode.toString()); 
     
           //图象生效 
           g.dispose(); 
     
           // 禁止图像缓存。 
           response.setHeader("Pragma", "no-cache"); 
           response.setHeader("Cache-Control", "no-cache"); 
           response.setDateHeader("Expires", 0); 
     
           response.setContentType("image/jpeg"); 
     
           // 将图像输出到Servlet输出流中。 
           ServletOutputStream sos = response.getOutputStream(); 
           ImageIO.write(buffImg, "jpeg", sos); 
           sos.flush(); 
           sos.close(); 
     
       } 
     
       Color getRandColor(int fc, int bc) {// 给定范围获得随机颜色 
           Random random = new Random(); 
           if (fc > 255) 
               fc = 255; 
           if (bc > 255) 
               bc = 255; 
           int r = fc + random.nextInt(bc - fc); 
           int g = fc + random.nextInt(bc - fc); 
           int b = fc + random.nextInt(bc - fc); 
           return new Color(r, g, b); 
       }
 
 }
 
 web.xml
 
 <servlet>
      <description></description>
      <display-name>RandomCode</display-name>
      <servlet-name>RandomCode</servlet-name>
      <servlet-class>com.song.test.RandomCode</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>RandomCode</servlet-name>
      <url-pattern>/RandomCode</url-pattern>
  </servlet-mapping>
 
 html:
 
 <body>
  <script type="text/javascript">
 
 /**刷新iframe**/
  function refreshCode(){
      window.frames["codeFrame"].location.reload();
  }
 
 /**替换图片,经测试在firefox下必须使用Math.random();**/
  function reloadCode(){
 
 document.getElementById("imgvcode").src = "http://127.0.0.1/js_test/RandomCode?rc="+Math.random();
  }
 
 </script>
 
 <iframe src="http://127.0.0.1/js_test/RandomCode" id="codeFrame" name="codeFrame" frameborder="no" border="0" marginwidth="0"
  marginheight="0" scrolling="no" allowtransparency="yes" height="35" width="102"></iframe>
  <a href="#" onclick="refreshCode();">看不清,换一张</a>
  <br> 
 <span id="codeImg"><img border=0 src="http://127.0.0.1/js_test/RandomCode"></span>
  <a href="#" onclick="reloadCode();">看不清,再换一张</a>
 
 </body>
  
Java实现验证码 最终效果实现思路使用BufferedImage用于在内存中存储生成的验证码图片使用Graphics来进行验证码图片的绘制,并将绘制在图片上的验证码存放到session中用于后续验证最后通过ImageIO将生成的图片进行输出通过页面提交的验证码和存放在session中的验证码对比来进行校验实现思路是拷贝别人的:https://blog.youkuaiyun.com/worm0527/article/detail... 阅读详情

相关推荐

Java实现登录验证码

Java实现登录验证码login.htmlCheckNumber.java(util)login.jsUserManController.java实现效果 login.html 在login.html中,用session接收前台输入的验证码。 <input id="userCaptcha" name="userCaptcha" type="text" placeholder="请输入验证码" /> <img id="kaptchaImage" src="./UserMan/getChe

weixin_42544710的博客 1706

Java验证码

验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序验证码的作用:防止刷票、论坛灌水、刷页防止黑客恶意破解密码,盗取用户数据验证码通常使用一些线条和一些不规则的字符组成,主要作用是为了防止一些黑客把密码数据化盗取。

Shawn的个人博客 3726

java实现短信验证码登录

java实现短信验证码登录 我这里是用的云片网发送短信,所以你在看代码的时候要看清楚你用的什么服务器发短信。 下面看代码,我这个不需要引入其他的jar包 controller 层 这个是获取验证码和用验证码登录 /** * 获取验证码 * @param wxUser * @return */ @GetMapping("/getCode") public String getCode(WxUserModel wxUser) throws IOExcep

Activiti工作流 6667

Java实现验证码功能

验证码一般用于登陆界面的防机器验证,但自已写一个验证码组件较为麻烦,我们可以用ValidateCode组件来实现,以下通过两个示例来演示ValidateCode的用法,最后附jar包,可自行下载。生成验证码,调用该方法可以重新生成验证码,实例化对象时会自动调用该方法生成一个默认的验证码,后续可再次调用生成。实例化对象,指定宽度和高度,默认验证码位数为5为位,障碍线为150;实例化对象,指定宽度、高度、验证码位数、障碍线数量;将生成的验证码图像写入输出流对象,可用于web端。

2301_77042303的博客 5537

java 实现发送短信验证码

java 发送短信验证码: package com.isoftstone.anze.convenient.utils; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import jav...

IT界的一只菜鸟 700

java实现验证码功能

效果 显示验证码图片 点击验证码图片,换一张 步骤 (1)编写html页面,点击图片时绑定单击事件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注册</title> <script> ...

qq_42487559的博客 724

JAVA—生成验证码的两种方法(代码+运行结果+总结)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的

m0_61120771的博客 2万+

Java EE中验证码功能的实现讲解

Java EE中验证码功能的实现讲解

cankunfang的博客 1050

Java 生成验证码的五种方式、源码、过程、结果

使用Java基本的逻辑和方法生成所需要的验证码,且生成的验证码包含大小写字母和数字,当然啦,也有纯数字的验证码。每一个方式都有详细的注释解析😆😆😆第一种方式 Random随机数类生成验证码第一种方式,是在main方法中生成的验证码,想要获取最终结果的小伙伴,可以把最后的for循环删除,然后把里面的代码提取成一个方法哦😊😊😊运行结果第二种方式 洗牌算法实现验证码这种方式实现的验证码很新奇,基本是不常见的验证码,会发现他生成的验证码出奇的乱,很少见😁😁😁运行结果。

回忆在这里记录着 6866

Java图文验证码实现详解

Captcha(全自动区分计算机和人类的图灵测试)是一种网络安全技术,旨在区分用户是由计算机程序发起还是由人类操作。在互联网应用中,Captcha常见于防止恶意软件、网络爬虫和自动化攻击。图文验证码是由一组字符和对应图片组成的验证方式,它是最早也是最常见的验证码形式。验证码全称是“全自动区分计算机和人类的图灵测试”,其主要目的是区分用户是计算机还是人,防止恶意自动化的软件(即机器人)自动访问某个网站。一个典型的图文验证码系统通常包括生成验证码图片、展示给用户、用户输入验证信息、后台验证等步骤。

weixin_42153793的博客 1359

GSview5.0安装步骤及问题

GSview5.0安装步骤及问题安装步骤遇到的问题 尝试过很多对图片去白边的方法,感觉最好用最有效的还是用GSview比较好操作。本文针对gsview安装及安装过程中踩过的坑记录下来。 安装步骤 在官网下载gsv50w64.exe(或32位的),直接双击安装即可。 安装Ghostscript;注意:GSview5.0不支持最新版的Ghostscript9.54,这里用到是9.27的版本可以在Github中找到,下载gs927w64.exe,一定要安装在GSview的安装目录Ghostgum下 Gho

LilianLYN的博客 1万+

java 界面实现动态验证码

一、生成验证码 (参考博文链接:https://www.cnblogs.com/nanyangke-cjz/p/7049281.html) package com.hd.orig; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImag...

Ranger的博客 1万+

SDU CS 期末考回忆版合集

删除原有分散的版本,合订起来画个。包括:机器学习、算法、图形学、操作系统、编译原理、软件工程、大数据分析管理、计算机体系结构等。

https://github.com/ZhaoyungZhang 6649

Java实现登录验证码的功能

Java实现登录验证码的功能

沐雨橙风ιε的博客 1万+

Difftest踩坑笔记(一)

Difftest是差分测试框架,有什么用呢?高性能CPU的设计需要做复杂的测试,传统的测试方法运行较慢,而且出了问题很难定位,Difftest就是为了解决这两个问题。

http://www.icfgblog.com/ 4196

Halcon相机标定实战:从参数设置到精度优化全解析

本文详细解析Halcon相机标定的全流程,从基础概念到实战技巧,涵盖参数设置、精度优化及常见问题解决方案。通过实际案例和代码示例,帮助读者掌握工业视觉项目中相机标定的关键技术,提升测量精度和系统稳定性。

weixin_29279153的博客 322

Java案例——实现验证码登陆

简介 作者简介:青铜码农,和大多数同学一样从零开始一步步学习,一步步积累。期待您的关注,让我们一起成长~注:本人学疏才浅,文章如有错误之处,敬请指正~ 内容简介:为了保证登陆的安全性,通常会要求在登陆界面中输入验证码。本内容主要讲解如何使用Java语言实现验证码登陆功能。 获取完整源码及图片素材: 功能预览: Java实现验证码功能 为了方便,此处只当用户名为123456,且密码为123456时就登陆成功。 由功能预览可知:当输入的用户名、密码都正确时将提示登陆成功;没有输入用...

Waylon_Ma的博客 1万+

稚晖君Dummy机械臂CAN总线控制详解:从代码到实战(附常见问题排查)

本文深入解析了稚晖君Dummy机械臂的CAN总线控制技术,从协议设计到代码实现,详细介绍了CAN总线在机械臂控制中的核心价值、通信协议栈设计、运动控制指令实现及常见问题排查方法。通过实战案例和代码示例,帮助开发者快速掌握机械臂CAN总线控制的关键技术。

uuu88的博客 295

Java 实现生成验证码以及验证

代码包含生成验证码,验证验证码,以及验证码的失效时间 标题代码包含生成验证码,验证验证码,以及验证码的失效时间生成验证码和验证验证码的Controller生成验证码类 生成验证码和验证验证码的Controller package com.example.security.zmain.generateImg; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.a

WXN的博客 1012

ResNet改进(50):SKConv和CBAM增强的ResNet模型

动态调整感受野大小- 结合通道和空间注意力模型的核心思想是在ResNet的每个残差块后插入这些注意力模块,使网络能够自适应地关注更重要的特征。模型的核心是类,它在标准ResNet34的基础上:替换了初始卷积层,使用更小的核(3×3)和步长(1)在每个残差块后选择性添加SKConv和CBAM模块# 加载预训练ResNet34# 自定义初始层# 添加注意力机制的残差层通过集成SKConv和CBAM,这个改进的ResNet模型能够更有效地捕捉多尺度特征并关注关键信息区域。

2401_82355416的博客 621

ARFoundation系列讲解-教程目录

一、教程目录 ARFoundation快速入门-01简介 ARFoundation快速入门-02环境搭建 ARFoundation快速入门-03环境配置之iOS ARFoundation快速入门-04环境配置之Android ARFoundation快速入门-05ARKit设备支持列表 ARFoundation快速入门-06ARCore设备支持列表 ARFoundation快速入门-07检查设备支持 ARFoundation快速入门-08平面检..........

a451319296的博客 3万+

Java实现图片验证码,点击刷新图片验证码

创建生成验证码图片的工具类: import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.FileOutputStream; import java.io.IOException; i...

琪丶琪的博客 4314

图像处理入门007:图像处理中的数学基础:线性代数与卷积

一种:把 OpenCV 当黑盒,调用,效果不对就乱调参数;另一种:理解每个像素是怎么被周围邻域"加权平均"的,理解核翻转、边界填充、stride 的含义。前者能干活,后者能解难题。一旦遇到自定义核(比如 ISP 上的锐化)、深度学习反向传播、医学图像重建,你就必须把卷积、相关、矩阵乘法这些基本功捡回来。线性代数三件套:向量点积、矩阵乘法、线性变换;2D 卷积的数学定义:核翻转、滑动窗口、边界填充。并手写一个,验证它与和的结果完全一致(误差 < 1e-9)。f∗gn∑m−∞∞f。

专注:太空算力、AI infra、异构调度、大模型成本工程 387

Java怎样实现验证码?

我们总是在登录微信,QQ或者其他一些网页的时候,都会出现一个验证码框,他们有的是数字的,有的是文字的,有的是混合的,各种各样的。 很好奇是怎么实现的。带着这样的疑问。 1.随机数字字母组合的验证码 首先创建一个javaWeb的工程 然后在之前创建的随机数方法里,进行循环答应,输出4个随机数 ...

Slovenia_groot的博客 8179

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java ~ 常用验证码实现大全。

Java ~ 常用验证码实现大全。

lyfGeek的博客 1521

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: fckeditor_for_java的用法
下一篇: string与stringbuffer的性能对比
sr2012
博客等级 码龄14年 0粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值