当前位置: 首页 > 编程日记 > 正文

使用kaptcha生成验证码

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 kaptcha是一个简单好用的验证码生成工具,通过配置,可以自己定义验证码大小、颜色、显示的字符等等。下面就来讲一下如何使用kaptcha生成验证码以及在服务器端取出验证码进行校验。

一、搭建测试环境

1.1、创建Web测试项目

  新建一个Web项目,并将kaptcha-2.3.2.jar放在项目的WEB-INF/lib目录下,如下图所示:

  

1.2、在web.xml文件配置生成验证码的KaptchaServlet

KaptchaServlet的详细配置如下:

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.5" 
 3     xmlns="http://java.sun.com/xml/ns/javaee" 
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 7   <welcome-file-list>
 8     <welcome-file>index.jsp</welcome-file>
 9   </welcome-file-list>
10   
11    <!-- kaptcha验证码配置 -->
12     <servlet>
13         <!-- 生成图片的Servlet -->
14         <servlet-name>Kaptcha</servlet-name>
15         <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
16         
17         <!-- 是否有边框-->
18         <init-param>
19             <param-name>kaptcha.border</param-name>
20             <param-value>no</param-value>
21         </init-param>    
22         <!-- 字体颜色 -->
23         <init-param>
24             <param-name>kaptcha.textproducer.font.color</param-name>
25             <param-value>red</param-value>
26         </init-param>
27         <!-- 图片宽度 -->
28         <init-param>
29             <param-name>kaptcha.image.width</param-name>
30             <param-value>135</param-value>
31         </init-param>
32         <!-- 使用哪些字符生成验证码 -->
33         <init-param>
34             <param-name>kaptcha.textproducer.char.string</param-name>
35             <param-value>ACDEFHKPRSTWX345679</param-value>
36         </init-param>
37         <!-- 图片高度 -->
38         <init-param>
39             <param-name>kaptcha.image.height</param-name>
40             <param-value>50</param-value>
41         </init-param>
42         <!-- 字体大小 -->
43         <init-param>
44             <param-name>kaptcha.textproducer.font.size</param-name>
45             <param-value>43</param-value>
46         </init-param>
47         <!-- 干扰线的颜色 -->
48         <init-param>
49             <param-name>kaptcha.noise.color</param-name>
50             <param-value>black</param-value>
51         </init-param>
52         <!-- 字符个数 -->
53         <init-param>
54             <param-name>kaptcha.textproducer.char.length</param-name>
55             <param-value>4</param-value>
56         </init-param>
57         <!-- 使用哪些字体 -->
58         <init-param>
59             <param-name>kaptcha.textproducer.font.names</param-name>
60             <param-value>Arial</param-value>
61         </init-param>        
62     </servlet>
63     <!-- 映射的url -->
64     <servlet-mapping>
65         <servlet-name>Kaptcha</servlet-name>
66         <url-pattern>/Kaptcha.jpg</url-pattern>
67     </servlet-mapping>
68 </web-app>
复制代码

1.3、显示生成的验证码

  在页面index.jsp显示验证码

复制代码
 1 <%@ page language="java" pageEncoding="UTF-8"%>
 2 <!DOCTYPE HTML>
 3 <html>
 4   <head>
 5     <title>显示KaptchaServlet生成的验证码</title>
 6     <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.9.1.js"></script>
 7     <script type="text/javascript">
 8         //点击切换验证码
 9         function changeVerifyCode(){
10             $("#yzmImg").attr("src","Kaptcha.jpg?"+Math.floor(Math.random()*100));
11         }
12         
13         //提交
14         function doSubmit() {
15             var verifyCodeValue = $("#verifyCode").val();
16             if(verifyCodeValue.replace(/\s/g,"") == "") {
17                 alert("请输入验证码");
18             }else {
19                 //提交前先异步检查验证码是否输入正确
20                 var verifyUrl = "${pageContext.request.contextPath}/servlet/VerifyServlet?verifyCode="+verifyCodeValue;
21                 $.ajax({
22                     type:"GET",
23                     url:verifyUrl,
24                     success:function(returnData){
25                         if(returnData!="Y") {
26                             alert("请输入正确的验证码!");
27                         }else {
28                             //验证码正确,进行提交操作
29                             alert("验证码输入正确,提交表单");
30                         }
31                     },
32                     error:function(e){
33                         alert(e);
34                     }
35                 });
36             }
37         }
38     </script>
39   </head>
40   
41   <body>
42        <form>
43         <table>
44             <tr>
45                 <td>    
46                         请输入验证码:
47                 </td>
48                 <td>
49                     <input type="text" name="verifyCode" id="verifyCode">
50                     <img src="Kaptcha.jpg" onclick="changeVerifyCode()" id="yzmImg" style="cursor: pointer;">
51                     <a href="javascript:void(0)" onclick="changeVerifyCode()">看不清,换一张</a>
52                 </td>
53             </tr>
54             <tr>
55                 <td>    
56                     &nbsp;
57                 </td>
58                 <td>
59                     <input type="button" value="提交" onclick="doSubmit()">
60                 </td>
61             </tr>
62         </table>
63     </form>    
64   </body>
65 </html>
复制代码

运行效果如下图所示:

1.4、在服务器端验证提交的验证码

用户在form表单中提交了验证码之后,我们会在服务器端进行验证,编写一个VerifyServlet,代码如下:

复制代码
 1 /**
 2  * 
 3  */
 4 package me.gacl.web.controller;
 5 
 6 import java.io.IOException;
 7 import java.io.PrintWriter;
 8 
 9 import javax.servlet.ServletException;
10 import javax.servlet.http.HttpServlet;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13 
14 public class VerifyServlet extends HttpServlet {
15 
16     
17     public void doGet(HttpServletRequest request, HttpServletResponse response)
18             throws ServletException, IOException {
19 
20         response.setContentType("text/html;charaset=utf-8");
21         response.setHeader("pragma", "no-cache");
22         response.setHeader("cache-control", "no-cache");
23         PrintWriter out = null;
24         try {
25             //响应数据
26             String resultData;
27             //获取传过来的验证码
28             String verifyCode = request.getParameter("verifyCode");
29             System.out.println("verifyCode----"+verifyCode);
30             if(verifyCode=="") {
31                 resultData = "N";
32             }else {
33                 //获取kaptcha生成存放在session中的验证码
34                 String kaptchaValue = (String) request.getSession().getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
35                 //比较输入的验证码和实际生成的验证码是否相同
36                 if(kaptchaValue == null || kaptchaValue == ""||!verifyCode.equalsIgnoreCase(kaptchaValue)) {
37                     resultData = "N";
38                 }else {
39                     resultData = "Y";
40                 }
41             }
42             out = response.getWriter();
43             out.write(resultData);
44             out.flush();
45         }catch(Exception e) {
46             e.printStackTrace();
47         }finally {
48             if(out != null) {
49                 out.close();
50             }
51         }
52     }
53 }
复制代码

  在web.xml中注册VerifyServlet

复制代码
1 <!-- 检查验证码是否输入正确 -->
2     <servlet>
3         <servlet-name>VerifyServlet</servlet-name>
4         <servlet-class>me.gacl.web.controller.VerifyServlet</servlet-class>
5     </servlet>
6     <servlet-mapping>
7         <servlet-name>VerifyServlet</servlet-name>
8         <url-pattern>/servlet/VerifyServlet</url-pattern>
9     </servlet-mapping>
复制代码

运行结果如下:

1、验证码不输入

2、输入错误的验证码

3、输入正确的验证码

  使用kaptcha生成验证码感觉挺不错的,非常好用和方便。

转载于:https://my.oschina.net/zhanghaiyang/blog/551872

相关文章:

主成分分析(PCA) C++ 实现

主成分分析(Principal Components Analysis, PCA)简介可以参考&#xff1a; http://blog.csdn.net/fengbingchun/article/details/78977202以下是PCA的C实现&#xff0c;参考OpenCV 3.3中的cv::PCA类。使用ORL Faces Database作为测试图像。关于ORL Faces Database的介绍可以参…

为何Google、微软、华为将亿级源代码放一个仓库?从全球最大代码管理库说起...

作者 | 夕颜编辑 | Just出品 | AI 科技大本营&#xff08;ID:rgznai100&#xff09;【导读】2017 年&#xff0c;在当时微软的一篇官方博客中&#xff0c;时任微软云开发服务副总裁的 Brian Harry 表示微软内部代码开始向 Git 迁移&#xff0c;宣布推出针对大规模 repo 的“Git…

jquery mobie导致超链接不可用

在a标签中添加rel"external"即可转载于:https://blog.51cto.com/here2142/1435434

编译器GCC与Clang的异同

GCC&#xff1a;GNU(Gnus Not Unix)编译器套装(GNU Compiler Collection&#xff0c;GCC)&#xff0c;指一套编程语言编译器&#xff0c;以GPL及LGPL许可证所发行的自由软件&#xff0c;也是GNU项目的关键部分&#xff0c;也是GNU工具链的主要组成部分之一。GCC(特别是其中的C语…

如何正确选择聚类算法? | CSDN博文精选

作者 | Josh Thompson翻译 | 张睿毅校对 | 王雨桐来源 | 数据派THU&#xff08;ID:DatapiTHU&#xff09;本文将介绍四种基本的聚类算法—层次聚类、基于质心的聚类、最大期望算法和基于密度的聚类算法&#xff0c;并讨论不同算法的优缺点。聚类算法十分容易上手&#xff0c;但…

Python工具 | 9个用来爬取网络站点的 Python 库

1️⃣Scrapy 一个开源和协作框架&#xff0c;用于从网站中提取所需的数据。 以快速&#xff0c;简单&#xff0c;可扩展的方式。 官网2️⃣cola 一个分布式爬虫框架。 GitHub3️⃣Demiurge 基于 PyQuery 的爬虫微型框架。 官网4️⃣feedparser 通用 feed 解析器。 官网5️⃣Gra…

Python并发编程实例教程

有关Python中的并发编程实例,主要是对Threading模块的应用,文中自定义了一个Threading类库。 一、简介  我们将一个正在运行的程序称为进程。每个进程都有它自己的系统状态&#xff0c;包含内存状态、打开文件列表、追踪指令执行情况的程序指针以及一个保存局部变量的调用栈。…

Nginx负载均衡之TCP端口高可用(二)

在前面我们实现了基本的HTTP反向代理&#xff0c;从互联网过来的请求已经可以分发到后端多台网站服务器上&#xff0c;但不是所有的业务都是网络类型的&#xff0c;此篇文章我们主要讨论的是TCP 端口的负载均衡做法&#xff0c;昨天也有小伙伴提到了&#xff0c;在HTTP反向代理…

语音识别大牛Daniel Povey为何加入小米?“手机+AIoT”强大生态,开源战略是关键...

整理 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;10 月 17 日&#xff0c;语音识别开源工具 Kaldi 创始人&#xff0c;语音和 AI 领域大牛 Daniel Povey 在10 月 19 日&#xff0c;小米集团副总裁、集团技术委员会主席崔宝秋发布微博&#xff0c;欢迎 Dani…

Python运维项目中用到的redis经验及数据类型

先感叹下&#xff0c;学东西一定要活学活用&#xff01; 我用redis也有几年的历史了&#xff0c;今个才想到把集合可以当python list用。 最近做了几个项目都掺杂了redis&#xff0c; 遇到了一些个问题和开发中提高性能的方法&#xff0c;这都分享出来&#xff0c;共同学习。…

图像边缘检测之拉普拉斯(Laplacian)C++实现

拉普拉斯算子(Laplacian)可应用到图像边缘检测中。在OpenCV中当kernel大小为3*3时&#xff0c;支持两种kernel算子&#xff0c;分别为&#xff1a;在OpenCV中默认的计算方式如下&#xff0c;假设有一个5*5的小图像&#xff0c;原始值依次为1,2,…25,如下图红色部分&#xff0c;…

从0到1,Airbnb的深度学习实践经验总结

作者 | Haldar译者 | 陆离出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;此前&#xff0c;AI科技大本营发布了关于希望通过介绍的研究成果为读者提供一些有用的帮助和指引。模型中的生态系统本文要讨论的机器学习现实应用&#xff0c;是关于根据用户预约的可能性来…

高并发大流量专题---8、动态语言的并发处理

高并发大流量专题---8、动态语言的并发处理 一、总结 一句话总结&#xff1a; 和本科毕业论文连起来了&#xff1a;基于消息中间件Rocket MQ的研究&#xff1b;用于并发处理的消息队列 1、什么是进程、线程、协程&#xff1f; 进程&#xff08;Process&#xff09;是计算机中的…

1. 文件系统——磁盘分区、各目录功能、硬盘

一、磁盘分区及文件访问入口在前文中介绍过&#xff0c;Linux的整个文件系统像一棵倒置的数&#xff0c;最顶层的是根文件系统&#xff0c;其下有很多一级子目录&#xff0c;一级子目录下面是二级子目录&#xff0c;依此类推&#xff1a;/&#xff1a;根目录/bin&#xff0c;/s…

吴恩达老师深度学习视频课笔记:逻辑回归公式推导及C++实现

逻辑回归(Logistic Regression)是一个二分分类算法。逻辑回归的目标是最小化其预测与训练数据之间的误差。为了训练逻辑回归模型中的参数w和b&#xff0c;需要定义一个成本函数(cost function)。成本函数(cost function)&#xff1a;它是针对整个训练集的。衡量参数w和b在整个训…

网络运行时间提高100倍,Google使用的AI视频理解架构有多强?

译者 | 刘畅出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;视频理解是一个很有挑战性的问题。由于视频包含时空数据&#xff0c;因此图像的特征表示需要同时提取图像和运动信息。这不仅对自动理解视频语义内容有重要性&#xff0c;还对机器人的感知和学习也至关重要…

iOS学习笔记(十三)——获取手机信息(UIDevice、NSBundle、NSLocale)

2019独角兽企业重金招聘Python工程师标准>>> iOS的APP的应用开发的过程中&#xff0c;有时为了bug跟踪或者获取用反馈的需要自动收集用户设备、系统信息、应用信息等等&#xff0c;这些信息方便开发者诊断问题&#xff0c;当然这些信息是用户的非隐私信息&#xff0…

吴恩达老师深度学习视频课笔记:单隐含层神经网络公式推导及C++实现(二分类)

关于逻辑回归的公式推导和实现可以参考&#xff1a; http://blog.csdn.net/fengbingchun/article/details/79346691 下面是在逻辑回归的基础上&#xff0c;对单隐含层的神经网络进行公式推导&#xff1a;选择激活函数时的一些经验&#xff1a;不同层的激活函数可以不一样。如果…

「2019中国大数据技术大会」超值学生票来啦!

大会官网&#xff1a;https://t.csdnimg.cn/U1wA经过11年的沉淀与发展&#xff0c;中国大数据技术大会见证了大数据技术生态在中国的建立、发展和成熟&#xff0c;已经成为国内大数据行业极具影响力的盛会&#xff0c;也是大数据人非常期待的年度深度分享盛会。在新的时代背景下…

校验正确获取对象或者数组的属性方法(babel-plugin-idx/_.get)

背景&#xff1a; 开发中经常遇到取值属性的时候&#xff0c;需要校验数值的有效性。 例如&#xff1a; 获取props对象里面的friends属性 props.user && props.user.friends && props.user.friends[0] && props.user.friends[0].friends 对于深层的对…

Ring Tone Manager on Windows Mobile

2019独角兽企业重金招聘Python工程师标准>>> 手机铃声经常能够体现一个人的个性&#xff0c;有些哥们儿在自习室不把手机设置成震动&#xff0c;一来电就#$^%^&^%#$&$*&#xff0c;声音还很大&#xff0c;唯恐别人听不到。 Windows Mobile设备上如何来设置手…

OpenCV3.3中K-Means聚类接口简介及使用

OpenCV3.3中给出了K-均值聚类(K-Means)的实现&#xff0c;即接口cv::kmeans&#xff0c;接口的声明在include/opencv2/core.hpp文件中&#xff0c;实现在modules/core/src/kmeans.cpp文件中,其中&#xff1a;下面对此接口中的参数作个简单说明&#xff1a;(1)、data&#xff1a…

一文读懂对抗机器学习Universal adversarial perturbations | CSDN博文精选

作者 | Icoding_F2014来源 | CSDN博客本文提出一种 universal 对抗扰动&#xff0c;universal 是指同一个扰动加入到不同的图片中&#xff0c;能够使图片被分类模型误分类&#xff0c;而不管图片到底是什么。示意图&#xff1a;形式化的定义&#xff1a;对于d维数据分布 μ&…

Reactor模式与Proactor模式

博主一脚刚踏进分布式的大门&#xff08;看《分布式Java应用》&#xff0c;如果大家有啥推荐的书欢迎留言~&#xff09;&#xff0c;发现书中对NIO采用的Reactor模式、AIO采用的Proactor模式一笔带过&#xff0c;好奇心趋势我找了一下文章&#xff0c;发现两篇挺不错的文章&…

linux下使profile和.bash_profile立即生效的方法

使profile生效的方法1.source /etc/profile使用.bash_profile生效的方法1 . .bash_profile2 source .bash_profile3 exec bash --login转载于:https://blog.51cto.com/shine20/1436473

吴恩达老师深度学习视频课笔记:多隐含层神经网络公式推导(二分类)

多隐含层神经网络的推导步骤非常类似于单隐含层神经网络的步骤&#xff0c;只不过是多重复几遍。关于单隐含层神经网络公式的推导可以参考&#xff1a; http://blog.csdn.net/fengbingchun/article/details/79370310 逻辑回归是一个浅层模型(shadow model)&#xff0c;或称单层…

Python中的元编程:一个关于修饰器和元类的简单教程

作者 | Saurabh Kukade译者 | 刘畅出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;最近&#xff0c;作者遇到一个非常有趣的概念&#xff0c;它就是用 Python 进行元编程。我想在本文中分享我对该主题的见解。作者希望它可以帮助解决这个问题&#xff0c;因为很多人说…

获取用户电脑的上网IP地址

在项目中经常要获取用户的上网的IP地址&#xff0c;如何获取用户的IP地址&#xff0c;方法很多&#xff0c;现在介绍以下2种。 /// <summary> /// 获取本机在局域网的IP地址 /// </summary> /// <returns></returns> …

数学图形(1.40)T_parameter

不记得在哪搞了个数学公式生成的图形. vertices 1000t from 0 to (2*PI) r 2.0 x r*(5*cos(t) - cos(6*t)) y r*(3*sin(t) - sin(4*t)) 给线加上一维变量的变化,使之变成面: vertices D1:360 D2:21u from 0 to (2*PI) D1 v from 0 to 20 D2x (v2)*cos(u) - cos((v3)*u…

K-均值聚类(K-Means) C++代码实现

K-均值聚类(K-Means)简介可以参考&#xff1a; http://blog.csdn.net/fengbingchun/article/details/79276668 以下是K-Means的C实现&#xff0c;code参考OpenCV 3.3中的cv::kmeans函数&#xff0c;均值点初始化的方法仅支持KMEANS_RANDOM_CENTERS。以下是从数据集MNIST中提取…