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;有时候十几连跪都不会放弃你上分的心情。…

python 隐马尔科夫_机器学习算法之——隐马尔可夫(Hidden Markov ModelsHMM)原理及Python实现...

前言上星期写了Kaggle竞赛的详细介绍及入门指导&#xff0c;但对于真正想要玩这个竞赛的伙伴&#xff0c;机器学习中的相关算法是必不可少的&#xff0c;即使是你不想获得名次和奖牌。那么&#xff0c;从本周开始&#xff0c;我将介绍在Kaggle比赛中的最基本的也是运用最广的机…

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

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

python替代hadoop_Python连接Hadoop数据中遇到的各种坑(汇总)

最近准备使用PythonHadoopPandas进行一些深度的分析与机器学习相关工作。(当然随着学习过程的进展&#xff0c;现在准备使用PythonSparkHadoop这样一套体系来搭建后续的工作环境)&#xff0c;当然这是后话。但是这项工作首要条件就是将Python与Hadoop进行打通&#xff0c;本来认…

java 自动化测试_java写一个自动化测试

你模仿购物车试一下&#xff0c;同样是买东西&#xff0c;加上胜负平的赔率&#xff0c;输出改下应该就可以了package com.homework.lhh;import java.util.ArrayList;import java.util.Comparator;import java.util.Scanner;public class Ex04 {public static void main(String…

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

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

java中的printnb_javaI/O系统笔记

1、File类File类的名字有一定的误导性&#xff1b;我们可能认为它指代的是文件&#xff0c;实际上却并非如此。它既能代表一个特定文件的名称&#xff0c;又能代表一个目录下的一组文件的名称。1.1、目录列表器如果需要查看目录列表&#xff0c;可以通过file.list(FilenameFilt…

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

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

java成员内部类_Java中的内部类(二)成员内部类

Java中的成员内部类(实例内部类)&#xff1a;相当于类中的一个成员变量&#xff0c;下面通过一个例子来观察成员内部类的特点public classOuter {//定义一个实例变量和一个静态变量private inta;private static intb;//定义一个静态方法和一个非静态方法public static voidsay(…

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

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

java存储键值结构_java-键值存储为主数据库

我将要开始一个项目,该项目的读写操作非常频繁且频繁.因此,环顾四周,我发现内存数据库正是为此目的而创建的.经过更多调查后,我进入了redis.Redis看起来很酷(虽然刚开始阅读,但是对此有很多了解).但是我主要只看过关系数据库,并且以元组和关系的方式来考虑数据(我认为我可以随着…

python 输入文件名查找_python 查找文件名包含指定字符串的方法

编写一个程序&#xff0c;能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件&#xff0c;并打印出绝对路径。import osclass searchfile(object):def __init__(self,path.):self._pathpathself.abspathos.path.abspath(self._path) # 默认当前目录def fin…

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

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

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

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

java判断对称素数_SM2非对称算法的原理及实现 Java SM2的代码案例 | 一生孤注掷温柔 | 小奋斗...

SM2椭圆曲线公钥密码算法&#xff1a;我国自主知识产权的商用密码算法&#xff0c;是ECC(Elliptic Curve Cryptosystem)算法的一种&#xff0c;基于椭圆曲线离散对数问题&#xff0c;计算复杂度是指数级&#xff0c;求解难度较大&#xff0c;同等安全程度要求下&#xff0c;椭圆…

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

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

python可以做特效吗_学习mel语言,Python,JavaScript到什么程度才能做一下大型特效,要自已开发插件脚本呢?...

感谢邀请。首先自己要在某一方面要擅长&#xff0c;认准一个定位。比如android是钥匙做前端应用软件的&#xff0c;python可以做爬虫及其人工智能&#xff0c;js做全段网页&#xff0c;java主要是做后端的1、我们程序员对于开发软件来说&#xff0c;无论你选择的是那种语言&…

POJ2513-Colored Sticks

/*思路&#xff1a;类似图论中“一笔画”问题&#xff0c;两根木棒的相连接的端点是一样的颜色&#xff0c;&#xff08;a,b&#xff09;--(b,c)--(c, d)....方法&#xff1a;trie树并查集&#xff0c; 利用trie树建立字符串和某一个节点的映射&#xff0c;并将这些和字符串构成…