【java图片验证码】Java 服务端生成图片验证码及验证

article/2025/9/20 20:20:31

Java 服务端生成图片验证码及验证

简介

验证码是防止有人利用机器人自动批量注册、对特定的注册用户用特定程序暴力破解方 式进行不断的登录、灌水。因为验证码是一个混合了数字或符号的图片,人眼看起来都费劲, 机器识别起来就更困难。

分析

登录表单很可能遭到模拟登录的暴力破解攻击,要么轻易获得特定账户的登录信息,要么给服务器增加了大量的负荷。解决的办法,一般就是在登录前给出一个随机的信息(验证码),非法的非 Web 途径登录者会看不到这个验证码,从而让用户安全登录。为防止攻击者破获验证码,需将验证信息作为图像显示在 Web 上。

代码实现:

利用 Servlet 实现一个 4 位的彩色验证码数据。

 import java.io.*;import java.awt.*;import java.awt.image.*;import java.util.*;import javax.imageio.*;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;​@WebServlet("/Image")public class Image extends HttpServlet {​protected void processRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("image/jpeg");//禁止图像缓存response.setHeader("Pragma","No-cache");response.setHeader("Cache-Control","no-cache");response.setDateHeader("Expires", 0);HttpSession session=request.getSession();// 在内存中创建图象int width=100, height=40;BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 获取图形上下文Graphics g = image.getGraphics();//生成随机类Random random = new Random();// 设定背景色g.setColor(getRandColor(200,250));g.fillRect(0, 0, width, height);//设定字体g.setFont(new Font("Times New Roman",Font.PLAIN,28));        // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到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);}// 取随机产生的认证码(4位数字)String sRand="";//准备一个数字加字母字典String string = "1234567890abcdefghijklmnopqrstuvwxyz";for (int i=0;i<4;i++){char rand=string.charAt(random.nextInt(string.length()));sRand+=rand;// 将认证码显示到图象中//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));g.drawString(Character.toString(rand),13*i+25,30);}// 将认证码存入SESSIONsession.setAttribute("rand",sRand);// 图象生效g.dispose();ServletOutputStream responseOutputStream =response.getOutputStream();// 输出图象到页面ImageIO.write(image, "JPEG", responseOutputStream);//以下关闭输入流!responseOutputStream.flush();responseOutputStream.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);}​protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {processRequest(request, response);}​protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {processRequest(request, response);}}

写完后保存文件,启动服务器,访问 Servlet 后可以看到页面中生成了一张图片验证码

 

测试与运行

该 Servlet 仅仅是一个验证码图像,接下来我们用 jsp 编写一个包含该验证码的登录页面

 

jsp 程序代码如下:

 <%@ page contentType="text/html;charset=UTF-8" language="java" %><%String path = request.getContextPath();String basePath = request.getScheme() + "://" + request.getServerName() + ":" +request.getServerPort() + path;%>​<!DOCTYPE HTML><html><head><title>表单验证</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><META HTTP-EQUIV="Pragma" CONTENT="no-cache"><META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"><META HTTP-EQUIV="Expires" CONTENT="0"><style>div {width: 240px;height: 100%;margin: 30px auto;}​label {margin: 5px auto;height: 22px;line-height: 22px;float: left;}​.input {margin: 5px auto;height: 20px;float: right;}​#submit {width: 100px;height: 35px;margin: 5px 8px;}</style></head>​<body><div><form id="myForm" action="" method="post" autocomplete="off" ><label>用户名:</label><input class="input" type="text" name="name" placeholder="请输入用户名"><br><label>密码:</label><input class="input" type="password" name="password" placeholder="请输入密码"><br><div style="margin-top: 10px;"><div style="height: 10px;width: 200px;margin-bottom: 0px"> </div><input style="width: 110px;height: 33px;margin-right: 20px;float: left " type="text" placeholder="图片验证码" name="code"><img style="float: right" title="看不清?点击切换。" id="changeServletImg" src="<%=basePath%>/Image/Image"></div><input style="margin-left: 140px" id="submit" type="button" value="登录"></form><div id="errorTips" style="text-align: center;font-size: 18px;color: red"></div></div></body><script>window.onload = function () {​var changeServletImgDOM = document.getElementById('changeServletImg');//点击图片时改变验证码changeServletImgDOM.onclick=change;​function change() {changeServletImgDOM.src="<%=basePath%>/Image/Image?"+new Date().getTime();};​document.getElementById('submit').onclick = check;​function check () {​//获取表单数据var name = document.getElementsByName('name')[0].value;var password = document.getElementsByName('password')[0].value;var code = document.getElementsByName('code')[0].value;var formInfo = 'name=' + name + '&password=' + password + '&code=' + code;var xhr = new XMLHttpRequest();//设置请求参数xhr.open("post","Example_13",true);xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");//发送请求xhr.send(formInfo);// 设置响应 HTTP 请求状态变化的函数xhr.onreadystatechange = function() {if (xhr.status == 200 && xhr.readyState == 4) {if(xhr.responseText == 'OK') {// 验证成功时跳转页面location.href = 'loginSuccess.html';} else {// 验证失败时给出错误提示document.getElementById('errorTips').innerText = xhr.responseText;}}}}}</script></html>

loginSuccess.html 代码如下:

 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>欢迎</title></head><body><h1>登录成功!</h1></body></html>

由于 jsp 先于 java 执行,导致 jsp 页面图片验证码获取的session值始终是示前一个。

所以无法直接在填写表单的页面完成验证码的验证。

接下来编写一个 Servlet 来接收由 AJAX 发送的表单数据,然后通过 AJAX 完成错误信息的回显,以及页面跳转。

(为了方便,这里用 equals 进行验证,不连接数据库) 【用户名和密码为 admin】

servlet 程序代码如下:

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 javax.servlet.http.HttpSession;import java.io.IOException;import java.io.PrintWriter;​@WebServlet("/Example_13")public class Example_13 extends HttpServlet {//判断用户是否存在 (为了方便,这里用 equals 进行验证,不连接数据库)public boolean isAdmin(String name,String password){//假设用户不存在boolean isExist = false;if("admin".equals(name) && "admin".equals(password)) {isExist = true;}return isExist;}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}​@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");PrintWriter out = resp.getWriter();//获取表单数据String name = req.getParameter("name");String password = req.getParameter("password");String code = req.getParameter("code");​//获取图片验证码HttpSession session =  req.getSession();String rand = (String)session.getAttribute("rand");//验证图片验证码if(rand.equals(code)) {getConnect();//验证用户名 密码if(isAdmin(name,password)) {closeConnect();out.print("OK");} else {out.print("用户名或密码错误!");}} else {out.print("验证码错误,验证失败!");}}}

效果如下:

 


http://chatgpt.dhexx.cn/article/AVPItoIN.shtml

相关文章

Java生成随机图片验证码工具类

一、第一种生成随机图片验证码 public class VerifyCodeUtil {//生成随机数据的数据源 public static final String VERIFY_CODES "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";private static Random random new Random();/*** 使用系统默认字符源生成验证码* param veri…

JS实现图片验证码

JS实现图片验证码 新手第一次发博客&#xff0c;还请多多关照 前言 前几天Net老师布置了一道实验作业&#xff0c;用JS实现文字验证码和简单的图片验证码&#xff0c;要求使用阿里巴巴矢量并且至少能更换三张图片完成 一、实验效果如图 解锁之前解锁成功 示例&#xff1a;…

springboot实现图片验证码登录

之前也看到网上有关于验证码的项目&#xff0c;但是自己试了几个不太行&#xff0c;没有较完整的项目&#xff0c;于是东拼西凑加上自己又稍微添加了一点功能。 现在这个项目可以实现的功能&#xff1a; 基于图片验证码登录&#xff0c;验证码输入正确可以跳转到成功页面&…

apifox图片验证码显示

添加后置脚本 脚本内容如下&#xff1a; var resp {response: pm.response.json() } let imgresp.response.data let template <img src"{{img}}" /> pm.visualizer.set(template,img)在此查看图片验证码

JS实现图片验证码功能

JS实现图片验证码功能 点关注不迷路&#xff0c;欢迎再来&#xff01;以下代码可以直接copy运行&#xff0c;不需要引入jquery.jar 1. html代码 <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> &l…

node实现图片验证码

使用node来做一个图片验证码 做一个下面的小案例&#xff0c;应该能够很快的理解。 首先我们需要创建一个项目。 使用express搭建一个简单的服务器。 安装express。 yarn add express在app文件下这样配置。 const express require(express) const app express() app.use…

Java实现图片验证码

我们在一些网站注册的时候&#xff0c;经常需要填写以上图片的信息。 这种图片验证方式是我们最常见的形式&#xff0c;它可以有效的防范恶意攻击者采用恶意工具,调用“动态验证码短信获取”接口进行动态短信发送, 导致接入用户短信被刷&#xff0c;造成账号余额损失。同时这种…

图片验证码

通过下面这个方法可以得到随机验证码&#xff1a; public String getIdentifyCode(){//得到验证码&#xff08;数字大小写字母&#xff09;String str"";Random randnew Random();for(int i0;i<6;i){switch(rand.nextInt(3)){case 0:int a(int) (Math.random()*26…

图片验证码破解

2.8图片验证码破解 在测试web平台时&#xff0c;难以避免的就是登录&#xff0c;登录的时候就会需要输入验证码&#xff01;有的是图型验证码有的是滑动验证码&#xff0c;那么在自动化中如何破解验证码&#xff1f;这里只介绍简单的图片验证码。 一般来说破解这种图形验证码…

Java实现图片验证码功能

文章目录 一、背景二、实现步骤1、maven中加入依赖2、CaptchaController.java3、生成验证码配置4、CaptchaService.java接口5、CaptchaServiceImpl.java实现类6、增加验证码校验涉及文件 一、背景 在实现登录功能时&#xff0c;为了防止特定的程序暴力破解&#xff0c;一般为了…

python 图片验证码

1.图片验证码第一步 # 导入绘图库 from PIL import ImageDraw, Image, ImageFont 2.生成图片验证类 # 图片验证类 class ImgCode(BaseHandler):# 定义随机颜色实例方法def get_random_color(self):R random.randrange(255)G random.randrange(255)B random.randrange(255)…

java 生成图片验证码

https://vimsky.com/zh-tw/examples/detail/java-class-javax.servlet.ServletOutputStream.html 开发过程中&#xff0c;需要服务端返回验证码图片给前台&#xff0c;想想该如何实现呢&#xff1f; 1、字节流的输入输出 2、生成一个验证码&#xff0c;自定义字母数字混合实现…

C# 图片验证码简单例子

C# 图片验证码简单例子 一、简述 记--使用PictureBox绘制验证码。 例子&#xff1a;外链:https://wwm.lanzouq.com/b0cafckej 密码:cxxn 二、效果 三、工程结构 四、源文件 Form1.cs文件 using System; using System.Drawing; using System.Windows.Forms;namespace Verifi…

springboot图片验证码

前言: 大家好&#xff01;我是小小&#xff01;今天我们用五分钟来用springboot实现我们常用的图形验证码功能模块&#xff01; 用户登录几乎是一个线上系统必不可少且使用相对比较频繁的一个模块&#xff0c;为了防止恶意暴力尝试&#xff0c;防止洪水攻击、防止脚本自动提交…

JavaWeb总结之通过Servlet生成验证码图片

项目地址:https://github.com/zhangzeminzZ/ServletStudy 目录 1.BufferedImage类介绍2.在Form表单中使用验证码图片3.服务器端对form表单提交上来的验证码处理 1.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类 创建一个DrawImage Servlet&#xff0c;用…

网站安全检测之图片验证码

2019独角兽企业重金招聘Python工程师标准>>> 在对网站安全进行整体的安全检测的时候&#xff0c;用户登陆以及用户留言&#xff0c;评论&#xff0c;设置支付密码&#xff0c;以及一些网站功能方面都会用到图片验证码&#xff0c;针对于验证码我们SINE安全对其进行了…

实现图片验证码【详细代码】

实际开发过程中经常遇到要实现图片验证码来防止外部使用脚本刷接口&#xff0c;所以说图片验证码是很有必要的一个小功能。 html <!--- 注册页面整增加图形验证码功能,这里为了更贴近企业级业务&#xff0c;我们在注册页面整增加图形验证码功能--> <div class"u…

图片验证码实现的几种方式

一、Google Kaptcha 1、简介 kaptcha 是一个非常实用的验证码生成工具。有了它&#xff0c;你可以生成各种样式的验证码&#xff0c;因为它是可配置的。kaptcha工作的原理是调用 com.google.code.kaptcha.servlet.KaptchaServlet&#xff0c;生成一个图片。同时将生成的验证码…

ajax请求后台返回数据

功能介绍&#xff1a;最近学习在做一个新闻管理系统&#xff0c;其中有一个模块做的是一个排行榜功能&#xff0c;分为东部联盟和西部联盟&#xff0c;当我点击他的时候&#xff0c;排行的数据会发生变化。由于这一块怎么整个页面中的一小块&#xff0c;所以使用的是局部刷新页…

如何取消ajax请求

之前在面试的时候&#xff0c;被面试官问到了如何取消ajax请求&#xff0c;然鹅并不知道&#xff0c;被刷之后痛定思痛&#xff0c;总结了原生XHR、jquery、axios取消ajax请求的方法。 原生XHR 对于原生XHR对象来说&#xff0c;取消的ajax的关键是调用XHR对象的.abort()方法 …