java 生成校验验证码_java生成验证码并进行验证

一实现思路使用BufferedImage用于在内存中存储生成的验证码图片使用Graphics来进行验证码图片的绘制,并将绘制在图片上的验证码存放到session中用于后续验证

最后通过ImageIO将生成的图片进行输出

通过页面提交的验证码和存放在session中的验证码对比来进行校验

二、生成验证码

页面通过访问servlet来生成验证码,servlet中的代码如下package org.test;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.util.Random;

import javax.imageio.ImageIO;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

* @author worm0527

* 2016-03-22 23:15:54

* 生成验证码

*/

public class ImageServlet extends HttpServlet{

// 图片高度

private static final int IMG_HEIGHT = 100;

// 图片宽度

private static final int IMG_WIDTH = 30;

// 验证码长度

private static final int CODE_LEN = 4;@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

doPost(req, resp);

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

// 用于绘制图片,设置图片的长宽和图片类型(RGB)

BufferedImage bi = new BufferedImage(IMG_HEIGHT, IMG_WIDTH, BufferedImage.TYPE_INT_RGB);

// 获取绘图工具

Graphics graphics = bi.getGraphics();

graphics.setColor(new Color(100, 230, 200)); // 使用RGB设置背景颜色

graphics.fillRect(0, 0, 100, 30); // 填充矩形区域

// 验证码中所使用到的字符

char[] codeChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456".toCharArray();

String captcha = ""; // 存放生成的验证码

Random random = new Random();

for(int i = 0; i < CODE_LEN; i++) { // 循环将每个验证码字符绘制到图片上

int index = random.nextInt(codeChar.length);

// 随机生成验证码颜色

graphics.setColor(new Color(random.nextInt(150), random.nextInt(200), random.nextInt(255)));

// 将一个字符绘制到图片上,并制定位置(设置x,y坐标)

graphics.drawString(codeChar[index] + "", (i * 20) + 15, 20);

captcha += codeChar[index];

}

// 将生成的验证码code放入sessoin中

req.getSession().setAttribute("code", captcha);

// 通过ImageIO将图片输出

ImageIO.write(bi, "JPG", resp.getOutputStream());

}

}

三、校验验证码

通过前台提交的验证码与session中数据进行对比来校验验证码,代码如下:

package org.test;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class CheckCodeServlet extends HttpServlet{

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

doPost(req, resp);

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

// 获取存放在session中的验证码

String code = (String) req.getSession().getAttribute("code");

// 获取页面提交的验证码

String inputCode = req.getParameter("code");

if(code.toLowerCase().equals(inputCode.toLowerCase())) { // 验证码不区分大小写

// 验证成功,跳转到成功页面

req.getRequestDispatcher("/success.jsp").forward(req, resp);

} else { // 验证失败

req.getRequestDispatcher("/fail.jsp").forward(req, resp);

}

}

}验证码提交页面html代码:

请输入验证码:

验证码

看不清?

当生成的验证码不清楚时需要刷新重新生成验证码,js代码如下:

function flushCode() {

// 每次刷新的时候获取当前时间,防止浏览器缓存刷新失败

var time = new Date();

document.getElementById("scode").src = "/getCode?time=" + time;

}

四、效果展示

生成的验证码

1b1862bc5b0cdb2c5ee658a885c038dc.png

验证成功

c767029cb12dda3f6845217295f0612c.png

ee67f7280c94ef99d71e205bee47971d.png

验证失败

d9ece2b35eb954b41f474f91289b170e.png

595f02c8742ff3765bd8656383764e2d.png

五、总结

本文介绍了验证码的生成和验证,生成的验证码比较简单没有添加线条等干扰因素,比较容易识别。在实际的项目中可采用其他的第三方验证码库来生成验证码。

以上。

worm0527的博客

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

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

相关文章

yy自动语音接待机器人_智能语音机器人落地产品有哪些?

据相关研究报告表明&#xff0c;在众多人工智能落地产品或者应用场景中&#xff0c;智能语音机器人无论从产品的成熟度还是应用的广泛度来说&#xff0c;都是人工智能行业最热门和最有前景的产品。智能语音机器人并不只是一款产品&#xff0c;它是所有智能语音系列产品的统称&a…

java资源文件获取属性_Java读写资源文件类Properties

Java中读写资源文件最重要的类是Properties1) 资源文件要求如下:1、properties文件是一个文本文件2、properties文件的语法有两种&#xff0c;一种是注释&#xff0c;一种属性配置。注 释&#xff1a;前面加上#号属性配置&#xff1a;以“键值”的方式书写一个属性的配置信息…

java被放弃了_为什么学Java那么容易放弃?

学习Java确实很容易就放弃&#xff0c;但是也很容易就学好&#xff0c;因为大多数人都是抱着试一试的心态&#xff0c;然后当后面就坚持不下去但是回过头来想一想&#xff0c;打游戏上分容易吗&#xff0c;一样是磕磕碰碰的&#xff0c;有时候十几连跪都不会放弃你上分的心情。…

java编程50_java经典50编程题(1-10)

1.有一对兔子从出生后第三个月起&#xff0c;每个月都生一对小兔子&#xff0c;小兔子长到三个月后每个月又生一对兔子&#xff0c;假设兔子不死亡&#xff0c;问每个月兔子的总数为多少&#xff1f;分析过程图片发自简书App示例代码图片发自简书App运行结果图片发自简书App反思…

超大规模集成电路_纳米级超大规模集成电路芯片低功耗物理设计分析(二)

文 | 大顺简要介绍了功耗的组成&#xff0c;在此基础上从工艺、电路、门、系统四个层面探讨了纳米级超大规模集成电路的低功耗物理设计方法。关键词&#xff1a;纳米级&#xff1b;超大规模集成电路&#xff1b;电路芯片&#xff1b;电路设计02纳米级超大规模集成电路芯片低功耗…

outlook反应慢的原因_保险管怎么区分慢熔和快熔?

保险丝快熔与慢熔的区别所有双帽;对于这样的产品特性和安全性熔丝; gG的”&#xff0c;即&#xff0c;与接触帽组合接触;即&#xff0c;所述双(内/外盖)的盖。和一般的小型或地下加工厂&#xff0c;以便执行切割角&#xff0c;降低生产成本&#xff0c;这将选择单个帽铆接“单&…

word 通配符_学会Word通配符,可以帮助我们批量处理好多事情

长文档需要批量修改或删除某些内容的时候&#xff0c;我们可以利用Word中的通配符来搞定这一切&#xff0c;当然&#xff0c;前提是你必须会使用它。通配符的功能非常强大&#xff0c;能够随意组合替换或删除我们定义的规则内容&#xff0c;下面易老师就分享一些关于查找替换通…

java 运行 出现选择_Eclipse 运行出现java.lang.NoClassDefFoundError的解决方法

上篇博文也提到了这个问题&#xff0c;但没有深入的讲解。这次特意做了整理&#xff0c;详细解释其原因。先看错误java.lang.NoClassDefFoundError&#xff0c;显然是java虚拟机找不到指定的类&#xff0c;多数情况下是外部jar中的类。Eclipse的自动化&#xff0c;集成化&#…

设置熄屏_刚买的手机微信收不到信息提醒耽误事情,手机到手一定要这样设置...

手机使用过程中经常会遇到第三方软件接收不到信息提醒的状况&#xff0c;常常因此耽误了很多重要的事情&#xff0c;造成损失。特别是刚换新手机或者手机刚升级系统时发生的最多。一般都觉得是手机问题&#xff0c;其实只是手机的系统设置出现了问题&#xff0c;只要跟我按照以…

multipartfile 获取音频时长_抖音音频下载捷径:一键提取音频,安卓+ios全通用,完全免费...

本文相关&#xff1a;抖音音频提取、抖音音频快捷指令、捷径怎么获取抖音音乐…昨天有抖友分享了一个抖音短视频链接&#xff0c;告诉我&#xff0c;她很喜欢这个视频里的歌曲&#xff0c;但是在很多歌曲app上面却找不到相同的版本&#xff0c;然后就问我&#xff0c;有没有什么…

php windows共享内存,给PHP开启shmop扩展实现共享内存

这篇文章主要介绍了关于给PHP开启shmop扩展实现共享内存&#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下在项目开发中&#xff0c;想要实现PHP多个进程之间共享数据的功能&#xff0c;让客户端连接能够共享一个状态&#xff0c…

导入ansys的实体怎么进行parameter_ANSYS在线缆线束设计中的仿真应用

ANSYS采用ANSYS Maxwell、Q3D、Twin Builder等电磁仿真软件&#xff0c;从线缆线束设计、寄生参数RLCG提取、到系统电磁兼容提供了全面仿真分析。创建模型ANSYS在Maxwell软件基础上提出针对用户定制化的“线缆线束设计工具包”&#xff0c;帮助客户参数化建立特定几何模型&…

怎么做95置信区间图_这种动态的OD图怎么做?简单3步快速搞定

之前在视频号中发过一个单车的出行数据可视化效果。动态展示了某天单车不同时段的运行情况&#xff0c;这种动态的OD可视化效果是如何制作的呢&#xff1f;使用的是kepler.gl进行制作的&#xff0c;其实非常简单&#xff0c;3步即可快速搞定。一、数据软件准备1、软件制作这种动…

捡到vivo手机怎么清除账号_为什么现在买手机,很少会去考虑OPPO和vivo呢?看一下老板怎么说...

不知道大家是否注意到&#xff0c;近年来OPPO和vivo的报道越来越少&#xff0c;而华为、荣耀和小米出现的频率越来越高。此外&#xff0c;网络上还有另外一个声音&#xff0c;一个专业的机友朋友说&#xff0c;宁可选择小米、OPPO和vivo&#xff0c;为什么熟悉自己手机的人不考…

php分析图片中水印的位置,关于ThinkPHP打水印及设置水印位置的分析

这篇文章主要介绍了ThinkPHP打水印及设置水印位置的方法,结合实例形式分析了thinkPHP打印与设置水印的相关操作步骤与具体实现技巧,需要的朋友可以参考下本文实例讲述了ThinkPHP打水印及设置水印位置的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;最近在用Thin…

华为交换机命令_华为交换机常用命令

华为交换机常用命令&#xff1a;1、display current-configuration 显示当前配置2、display interface GigabitEthernet 1/1/4 显示接口信息3、display packet-filter interface GigabitEthernet 1/1/4 显示接口acl应用信息4、display acl all 显示所有acl设置 3900系列交换机5…

文件管理系统_Python学习第170节--Linux文件管理系统实际操作和具体介绍

【每天几分钟&#xff0c;从零入门python编程的世界&#xff01;】上节我们简单了解了Linux文件管理系统&#xff0c;现在我们学习它的实际操作。首先我们解释下~和/的区别。~之前我们介绍过&#xff0c;我们说~是Linux系统的根目录&#xff0c;其实这个说法是不准确的&#xf…

redis 计数器 java_Redis 的 8 大应用场景!

之前讲过Redis的介绍&#xff0c;及使用Redis带来的优势&#xff0c;这章整理了一下Redis的应用场景&#xff0c;也是非常重要的&#xff0c;学不学得好&#xff0c;能正常落地是关键。下面一一来分析下Redis的应用场景都有哪些。1、缓存缓存现在几乎是所有中大型网站都在用的必…

预测分析算法的设计与实现_基于LD(编辑距离算法)的单词速记数据库分析设计与实现...

2020-21-1学期《最新数据库管理系统》结课作业展示。作者&#xff1a;牟伦利 褚四浩 陈思琴 曹鹏飞(电商11802)分工陈思琴&#xff1a;系统需求分析 、系统相关算法分析和ER图曹鹏飞&#xff1a;系统数据字典 、业务流程图、数据流程图和PPT制作牟伦利&#xff1a;存储过程、触…

matlab knnsearchidx,matlab查找最临近搜索knnsearch

[Idx,D] knnsearch(___) additionally returns the matrix D, using any of the input arguments in the previous syntaxes. D contains the distances between each observation in Y and the corresponding closest observations in X.使用先前语法中的任何输入参数返回矩阵…