一、关于验证码

首先来说,验证码在我们的日常登录,发表言论时比较常见,它是一种用来区分登录用户是人还是机器的一种公共自动程序。它可以防止恶意破解密码、刷票、论坛灌水。

二、用java来实现验证码

    了解了验证码的作用,接下来我们就用java来实现验证码这一功能。首先我们先分析一下,怎么生成一个验证码。我们需要一个BufferedImage对象来保存图片;通过它来获得Graphics对象;通过Randrom产生随机验证码信息;使用Graphics绘制图片;记录验证码信息到session中;使用ImageIO输出图片;

 1 package com.water.servlet;
 2
 3 import com.sun.javafx.font.FontStrike;
 4
 5 import javax.imageio.ImageIO;
 6 import javax.servlet.ServletException;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 import java.awt.*;
11 import java.awt.image.BufferedImage;
12 import java.io.IOException;
13 import java.util.Random;
14
15 public class ImgServlet extends HttpServlet {
16     @Override
17     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
18         BufferedImage bi = new BufferedImage(68, 22, BufferedImage.TYPE_INT_RGB);
19         Graphics graphics = bi.getGraphics();
20         Color color = new Color(200, 150, 255);
21         graphics.setColor(color);
22         graphics.fillRect(0,0,68,32);
23         char[] chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
24         StringBuffer sb = new StringBuffer();
25         Random random = new Random();
26         for (int i = 0; i < 4; i++) {
27             char aChar = chars[random.nextInt(36)];
28             graphics.setColor(new Color(random.nextInt(88),random.nextInt(188),random.nextInt(255)));
29             graphics.drawString(aChar+"",(i*15)+3,18);
30             sb.append(aChar);
31         }
32         req.getSession().setAttribute("charCode",sb.toString());
33         ImageIO.write(bi,"jpg",resp.getOutputStream());
34
35     }
36 }

写一个 登录页面来检验验证码的正确与否。

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <html>
 3   <head>
 4     <title>checkCode</title>
 5     <script>
 6         function reloadCode(){
 7             var time = new Date().getTime();//为了防止缓存导致不能正常刷新验证码
 8             document.getElementById("picCode").src = "<%=request.getContextPath()%>/imgServlet?d="+time;
 9         }
10     </script>
11   </head>
12   <body>
13   <form action="<%=request.getContextPath()%>/loginServlet" method="post">
14     验证码:<input type="text" name="checkCode" />
15     <img id="picCode" src="<%=request.getContextPath()%>/imgServlet" />
16     <a href="javascript:reloadCode();">看不清楚</a>
17     <input type="submit" value="Checked" />
18   </form>
19   </body>
20
21 </html>

通过验证,我们发现验证码可以正确显示并能实现验证功能。但是在日常中,有着各种各样的验证码:算术类型,文字类型,动画类型,纯数字类型,数字与文字、字母相结合类型等等,那么我们在开发中该怎么实现这些功能呢?

三、 验证码组件

    我们能够走的更远更扎实,是因为我们站在巨人的肩旁上。我们的前辈们,已经开发了一些很好的组件可供我们使用,比如下面这些:Jcaptcha组件和Kaptcha组件。由于Jcaptcha组件需要和Spring框架结合来使用,我们就先咱不做介绍,我们主要来说一说Kaptcha组件。

a. 使用之前要先下载Kaptcha组件(提取密码:1vrf)

b. 然后是在web.xml中配置它

1 <servlet>
2     <servlet-name>Kaptcha</servlet-name>
3     <servlet-class>com.google.com.kaptcha.servlet.KaptchaServlet</servlet-class>
4 </servlet>
5 <servlet-mapping>
6    <servlet-name>Kaptcha</servlet-name>
7    <url-pattern>/randromCode.jpg</url-pattern>
8 </servlet-mapping>

Tips:Kaptcha组件还有很多配置选项供我们使用。

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
  3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
  5     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  6
  7     <servlet>
  8         <servlet-name>Kaptcha</servlet-name>
  9         <servlet-class>
 10             KaptchaServlet
 11         </servlet-class>
 12         <init-param>
 13             <description>图片边框,合法值:yes , no</description>
 14             <param-name>kaptcha.border</param-name>
 15             <param-value>yes</param-value>
 16         </init-param>
 17         <init-param>
 18             <description>
 19                 边框颜色,合法值: r,g,b (and optional alpha) 或者
 20                 white,black,blue.
 21             </description>
 22             <param-name>kaptcha.border.color</param-name>
 23             <param-value>black</param-value>
 24         </init-param>
 25         <init-param>
 26             <description>边框厚度,合法值:>0</description>
 27             <param-name>kaptcha.border.thickness</param-name>
 28             <param-value>1</param-value>
 29         </init-param>
 30         <init-param>
 31             <description>图片宽 200</description>
 32             <param-name>kaptcha.image.width</param-name>
 33             <param-value>200</param-value>
 34         </init-param>
 35         <init-param>
 36             <description>图片高 50</description>
 37             <param-name>kaptcha.image.height</param-name>
 38             <param-value>50</param-value>
 39         </init-param>
 40         <init-param>
 41             <description>图片实现类</description>
 42             <param-name>kaptcha.producer.impl</param-name>
 43             <param-value>
 44                 com.google.code.kaptcha.impl.DefaultKaptcha
 45             </param-value>
 46         </init-param>
 47         <init-param>
 48             <description>文本实现类</description>
 49             <param-name>kaptcha.textproducer.impl</param-name>
 50             <param-value>
 51                 com.google.code.kaptcha.text.impl.DefaultTextCreator
 52             </param-value>
 53         </init-param>
 54         <init-param>
 55             <description>文本集合,验证码值从此集合中获取</description>
 56             <param-name>kaptcha.textproducer.char.string</param-name>
 57             <param-value>1234567890</param-value>
 58         </init-param>
 59         <init-param>
 60             <description>验证码长度 5</description>
 61             <param-name>kaptcha.textproducer.char.length</param-name>
 62             <param-value>2</param-value>
 63         </init-param>
 64         <init-param>
 65             <description>字体 Arial, Courier</description>
 66             <param-name>kaptcha.textproducer.font.names</param-name>
 67             <param-value>Arial, Courier</param-value>
 68         </init-param>
 69         <init-param>
 70             <description>字体大小 40px.</description>
 71             <param-name>kaptcha.textproducer.font.size</param-name>
 72             <param-value>40</param-value>
 73         </init-param>
 74         <init-param>
 75             <description>
 76                 字体颜色,合法值: r,g,b 或者 white,black,blue.
 77             </description>
 78             <param-name>kaptcha.textproducer.font.color</param-name>
 79             <param-value>black</param-value>
 80         </init-param>
 81         <init-param>
 82             <description>文字间隔 2</description>
 83             <param-name>kaptcha.textproducer.char.space</param-name>
 84             <param-value>2</param-value>
 85         </init-param>
 86         <init-param>
 87             <description>干扰实现类</description>
 88             <param-name>kaptcha.noise.impl</param-name>
 89             <param-value>
 90                 <!-- com.google.code.kaptcha.impl.NoNoise -->
 91                 com.google.code.kaptcha.impl.DefaultNoise
 92             </param-value>
 93         </init-param>
 94         <init-param>
 95             <description>
 96                 干扰颜色,合法值: r,g,b 或者 white,black,blue.
 97             </description>
 98             <param-name>kaptcha.noise.color</param-name>
 99             <param-value>black</param-value>
100         </init-param>
101         <init-param>
102             <description>
103                 图片样式: 水纹com.google.code.kaptcha.impl.WaterRipple
104                 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy
105                 阴影com.google.code.kaptcha.impl.ShadowGimpy
106             </description>
107             <param-name>kaptcha.obscurificator.impl</param-name>
108             <param-value>
109                 com.google.code.kaptcha.impl.WaterRipple
110             </param-value>
111         </init-param>
112         <init-param>
113             <description>背景实现类</description>
114             <param-name>kaptcha.background.impl</param-name>
115             <param-value>
116                 com.google.code.kaptcha.impl.DefaultBackground
117             </param-value>
118         </init-param>
119         <init-param>
120             <description>背景颜色渐变,开始颜色</description>
121             <param-name>kaptcha.background.clear.from</param-name>
122             <param-value>green</param-value>
123         </init-param>
124         <init-param>
125             <description>背景颜色渐变,结束颜色</description>
126             <param-name>kaptcha.background.clear.to</param-name>
127             <param-value>white</param-value>
128         </init-param>
129         <init-param>
130             <description>文字渲染器</description>
131             <param-name>kaptcha.word.impl</param-name>
132             <param-value>
133                 com.google.code.kaptcha.text.impl.DefaultWordRenderer
134             </param-value>
135         </init-param>
136         <init-param>
137             <description>
138                 session中存放验证码的key键
139             </description>
140             <param-name>kaptcha.session.key</param-name>
141             <param-value>KAPTCHA_SESSION_KEY</param-value>
142         </init-param>
143         <init-param>
144             <description>
145                 The date the kaptcha is generated is put into the
146                 HttpSession. This is the key value for that item in the
147                 session.
148             </description>
149             <param-name>kaptcha.session.date</param-name>
150             <param-value>KAPTCHA_SESSION_DATE</param-value>
151         </init-param>
152     </servlet>
153     <servlet-mapping>
154         <servlet-name>Kaptcha</servlet-name>
155         <url-pattern>/randomcode.jpg</url-pattern>
156     </servlet-mapping>
157
158 </web-app>

View Code

当我们需要使用那些效果时,我们可以在web.xml中配置它们。

转载于:https://www.cnblogs.com/shouming/articles/7362344.html

用java实现验证码(CAPTCHA)相关推荐

  1. java生成验证码并进行验证

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

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

    Java ~ 常用验证码实现大全. 文章目录 Java ~ 常用验证码实现大全. 随机字符串验证码. 使用 JavaScript 实现随机字符串验证码. 算数验证码. Java. JavaScript ...

  3. Java 图形验证码

    EasyCaptcha 1.简介  Java图形验证码,支持gif.中文.算术等类型,可用于Java Web.JavaSE等项目. 2.效果展示             算术类型:       中文类 ...

  4. 真香!推荐一个超级简单 Java 图形验证码模块

    简介 Java图形验证码,支持Gif.中文.算术等类型,可用于Java Web.JavaSE等项目. 效果展示 集成项目 maven方式引入: <dependencies><depe ...

  5. java生成验证码的三种方法

    java生成验证码的三种方法 第一种:导入jar包com.github.axet生成法 ①导包 <dependency><groupId>com.github.axet< ...

  6. java生成验证码实例_Java生成验证码功能实例代码

    页面上输入验证码是比较常见的一个功能,实现起来也很简单.给大家写一个简单的生成验证码的示例程序,需要的朋友可以借鉴一下. 闲话少续,直接上代码.代码中的注释很详细. package com.SM_te ...

  7. java图形验证码生成工具类

    转载自   java图形验证码生成工具类 生成验证码效果       ValidateCode.java 验证码生成类 package cn.dsna.util.images; import java ...

  8. Java识别验证码和图像处理

    阅读本文可能会解决的问题: ① Java识别验证码 ② Tess4J的使用和OCR识别 ③ JavaCV的使用二值化和灰度测试 ④ Java裁剪和缩放图片 ⑤ 如何生成数字&字母验证码 ⑥ . ...

  9. java加减法验证码_Java,Springboot 实现算法验证码加减法图形验证码,Kaptcha 实现加减法验证码...

    最近在做一个加减法验证码,记录下实现的过程. 通常Java实现验证码的工具会用到 kaptcha 这个工具包,但实现的验证码都是图形验证码,没有看到加法验证码,查询了相关资料,实现了加减法验证码,效果 ...

最新文章

  1. 《网络安全协议》课程实验大纲
  2. Vue报错:Error while running task D:\vue\forum:build with message‘spawn vue-cli-service ENOENT‘
  3. python上海培训哪里比较好-上海python培训哪家好 Python需要多久学会
  4. Selenium WebDriver问题--Internet Explorer保护模式设置问题
  5. html怎么设置log区,javlog
  6. 查看redis aof内存_Redis持久化问题定位与优化技巧
  7. 基于FPGA实现USB2.0接口方案设计
  8. web前端网站优化-你真的不重要了吗?
  9. 使用phantomjs将网页转换成pdf或者长图片
  10. 微商深度揭秘——减肥产品、推广方法
  11. 使用python实现往手机发短信(基于twilio)
  12. OSPF--DR与BDR
  13. python 根据坐标点计算方位角函数
  14. 双馈风机DFIG并网(Matlab Simulink) 有详细说明
  15. 提高客户转化率的关键点
  16. 【Kubernetes 企业项目实战】03、基于 Alertmanager 发送报警到多个接收方(下)
  17. 程序员代码面试指南刷题--第五章.字符串的调整I
  18. 双亲委派机制以及打破双亲委派机制
  19. 关于1byte 1KB 1MB 1GB求其所能表示的地址范围
  20. java异步回调讲解

热门文章

  1. cocos2d-x lua table数据存储
  2. IOS:批量导入图片和视频到模拟器的相册
  3. Delphi中的时间操作技术(1)
  4. Could not resolve all dependencies for configuration ':app:_debugApk'
  5. Antd 修改主题颜色2018 最新版 填坑记录
  6. 杭电acm 2177 取(2堆)石子游戏(威佐夫博弈)
  7. python 学习DAY03
  8. 敏捷冲刺每日报告——Day5
  9. CSS 如何让 height:100%; 起作用
  10. [转]数据库分库分表