以前碰到注册登录需要图形验证码的时候,一般都是到网络上直接淘一个,也不读代码,直接就用了,今天静下来,从头到尾读了一遍代码,自己又照着写了一遍,加上了完整的注释,下面介绍步骤,首先新建一个web项目,src新建一个class类:

  1 import java.awt.BasicStroke;
  2 import java.awt.Color;
  3 import java.awt.Font;
  4 import java.awt.Graphics;
  5 import java.awt.Graphics2D;
  6 import java.awt.image.BufferedImage;
  7 import java.io.FileNotFoundException;
  8 import java.io.FileOutputStream;
  9 import java.io.IOException;
 10 import java.io.OutputStream;
 11 import java.util.Random;
 12
 13 import javax.imageio.ImageIO;
 14
 15 public class VCode {
 16
 17     private int w;// 图片宽
 18     private int h;// 图片高
 19     private Color bgColor = new Color(240, 240, 240);// 背景色
 20     private Random random = new Random();// 随机数对象
 21     // 设置字体范围
 22     private String[] fontNames = { "宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑",
 23             "楷体" };
 24     //设置字体样式范围
 25     private int[] fontstyles = { 0, 1, 2, 3 };
 26     //设置字号范围
 27     private int[] fontSizes={24,25,26,27,28};
 28     //设置所有字符串范围
 29     private String codes="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
 30
 31
 32     //无参构造方法
 33     public VCode() {
 34     }
 35
 36     //带宽和高的构造函数
 37     public VCode(int w, int h) {
 38         super();
 39         this.w = w;
 40         this.h = h;
 41     }
 42
 43
 44     // 返回一张背景图片
 45     private BufferedImage createImage() {
 46         /**
 47          * 1:创建图片 2:设置背景色
 48          */
 49         // 1:创建图片
 50         BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
 51         // 2:设置背景色
 52         Graphics g = img.getGraphics();
 53         g.setColor(bgColor);
 54         g.fillRect(0, 0, w, h);
 55
 56         return img;
 57     }
 58
 59     // 随机返回字体颜色
 60     private Color randomColor() {
 61         int r = random.nextInt(256);
 62         int g = random.nextInt(256);
 63         int b = random.nextInt(256);
 64         return new Color(r, g, b);
 65     }
 66
 67     // 随机返回字体样式
 68     private Font randomFont() {
 69         //随机生成字体下标,随机从给定的范围内获取一个字体
 70         int index=random.nextInt(fontNames.length);
 71         String name=fontNames[index];
 72
 73         //随机生成字体样式下表,随机从给定的返回内获取到一个字体样式
 74         index=random.nextInt(fontstyles.length);
 75         int style = fontstyles[index];
 76
 77         //随机生成字体大小下标,随机从给定的返回内获取到一个字体大小
 78         index=random.nextInt(fontSizes.length);
 79         int size = fontSizes[index];
 80
 81         return new Font(name, style, size);
 82     }
 83
 84     // 随机返回字体内容
 85     private String randomChar() {
 86         int index=random.nextInt(codes.length());
 87
 88         return codes.charAt(index)+"";
 89     }
 90
 91     //随即返回几条干扰线
 92     private void getLine(BufferedImage img){
 93         //设置干扰线的宽度为1.5倍宽,随机画五条
 94         Graphics2D g=(Graphics2D)img.getGraphics();
 95         g.setColor(Color.BLACK);
 96         g.setStroke(new BasicStroke(1.5f));
 97         for(int i=0;i<5;i++){
 98             int x1=random.nextInt(w);
 99             int y1=random.nextInt(h);
100             int x2=random.nextInt(w);
101             int y2=random.nextInt(h);
102             g.drawLine(x1, y1, x2, y2);
103
104         }
105
106     }
107     // 用户调用该方法获取图片
108     public BufferedImage getImage() {
109         /**
110          * 随机生成字符,字符范围0-9A-Za-z, 设置字体,字号,是否粗体 都是随机 字符的颜色
111          */
112         BufferedImage img = createImage();
113
114         this.getLine(img);
115         // 获取画笔
116         Graphics g = img.getGraphics();
117         // 画内容
118         for (int i = 0; i < 4; i++) {
119             g.setColor(this.randomColor());// 获取随机颜色
120             g.setFont(this.randomFont());// 获取随机字体
121             g.drawString(this.randomChar(), w / 4 * i, h - 5);// 获取字符串随机内容
122         }
123         return img;
124     }
125
126     //用户调用该方法保存图片到本地
127     public void saveImage(BufferedImage img,OutputStream ous){
128
129         try {
130             ImageIO.write(img, "JPEG", ous);
131         } catch (FileNotFoundException e) {
132             e.printStackTrace();
133         } catch (IOException e) {
134             e.printStackTrace();
135         }
136     }
137 }

接下来新建一个servlet:

 1 package com.wang.verifySode;
 2
 3 import java.awt.Color;
 4 import java.awt.Font;
 5 import java.awt.Graphics;
 6 import java.awt.image.BufferedImage;
 7 import java.io.FileOutputStream;
 8 import java.io.IOException;
 9 import java.io.PrintWriter;
10
11 import javax.imageio.ImageIO;
12 import javax.servlet.ServletException;
13 import javax.servlet.http.HttpServlet;
14 import javax.servlet.http.HttpServletRequest;
15 import javax.servlet.http.HttpServletResponse;
16
17 public class BServlet extends HttpServlet {
18
19     public void doGet(HttpServletRequest request, HttpServletResponse response)
20             throws ServletException, IOException {
21
22         VCode v=new VCode(70, 35);
23         BufferedImage img=v.getImage();
24         v.saveImage(img, response.getOutputStream());
25
26     }
27
28 }

在你需要加验证码的地方,如注册页面中适当地方加入:

<img id="img" alt="" src="/tools/BServlet"><a href="javascript:changeNext()">看不清楚,换一张</a>

这里需要说一下,因为验证码有一个"看不清楚 换一张"的功能,所以需要加一个javascript函数,如下:

<script type="text/javascript">function changeNext(){var a=document.getElementById("img");a.src="/tools/BServlet?a="+new Date().getTime();}
</script>

为了避免浏览器的图片缓存问题而导致点击后无法随机下一张图片,这里在超链接后面加一个永不重复的参数,可以避免这个问题,见上面代码.

配置项目,开浏览器,运行,完美~

转载于:https://www.cnblogs.com/fingerboy/p/5152683.html

自己动手实现一次性图片验证码相关推荐

  1. 怎样用Java自制优秀的图片验证码?这样!

    Completely Automated Public Turing test to tell Computers and Humans Apart 全自动区分计算机和人类的图灵测试 简称CAPTCH ...

  2. LR之识别图片验证码

    实例:web管理系统 目的:对该管理系统的重要业务进行并发压力测试,如登录,查询等 准备大干一场的时候,却在登录界面卡住了,因为登录页面需要输入验证码,而且验证码是随机生成的图片数字验证码,如果不能正 ...

  3. 教程 | 用Python识别图片验证码中的文字

    作者 | 老表 来源 | 简说Python(ID:xksnh888xksnh888) [导语]在今天这篇文章中,作者分享给大家一个有趣又干货满满的 Python 项目.通过这份教程,大家不仅又多了一个 ...

  4. Java实现点击中文文字图片验证码

    Java实现点击中文文字图片验证码 环境条件 JDK1.8 MAVEN-3.3 spring-boot-2.1.17.RELEASE Redis 注意事项 Java AWT在背景图片上绘写文件时候设置 ...

  5. 中国土地市场爬虫——浏览器cookie验证(图片验证码)

    通过我上篇博客:中国土地市场网爬虫--浏览器Cookie验证(简单) 讲述了中国土地市场网(www.landchina.com)的三种验证方式. 该网站的三种防止爬虫策略 1.通过cookie验证,三 ...

  6. 【图片验证码识别】使用深度学习来 识别captcha 验证码

    谷歌图形验证码在AI 面前已经形同虚设,所以谷歌宣布退出验证码服务,这是为什么呢? 以下文章也许可以解释原因 本文会通过 Keras 搭建一个深度卷积神经网络来识别 captcha 验证码,建议使用显 ...

  7. 我妈问我12306购票时为啥需要图片验证码

    如何给别人讲清楚图片验证码的原理,通过打比方的方式通俗易懂解释图片验证码的作用及原理. 登录系统时图片验证码的原理,下面通过打比方的方式给你讲清楚. 用户要登录系统就好比要进入一个门上上锁的房间,用户 ...

  8. 点选式图片验证码的一种实现效果

    一背景 人机识别,反爬虫等,相信去关注这块的,诉求比较明确. 通常来说,市面上很多这种,腾讯的验证码,网易的盾,还有极验这种专做这块的.好处是:验证方式多样,申请key,调用api 即可,不用去开发. ...

  9. java爬取验证码图片_JAVA HttpClient实现页面信息抓取(获取图片验证码并传入cookie实现信息获取)...

    JAVA HttpClient实现页面信息抓取(获取图片验证码并传入cookie实现信息获取) 发布时间:2018-05-18 16:41, 浏览次数:632 , 标签: JAVA HttpClien ...

最新文章

  1. Android中设置EditText默认无焦点
  2. 常用webshell提权方法总结
  3. 防火墙的基础知识入门
  4. win10安装vmware tools + 无法拖拽文件解决
  5. leetcode —— 面试题17. 打印从1到最大的n位数
  6. 是男人就下100层【第五层】——2048游戏从源码到发布市场
  7. private关键字
  8. On September 8, the “PDF first share“ Foxit Software
  9. shell脚本学习指南——好书推荐
  10. Navicat安装问题及解决办法
  11. CASS使用-20220617更新
  12. silvaco的石墨烯fet仿真_高灵敏度表面等离子体光纤传感器仿真设计(二)
  13. STM8和STM32开发总结
  14. 安装MySQL提示cab文件损坏_安装所需的 CAB 文件“Redist.cab”已损坏处理办法
  15. 阿里云+VMware会擦出怎样的火花?
  16. 农夫 狼 羊 白菜 java,农夫、狼、羊、白菜(回溯法求解)
  17. 发送邮件(支持所有smtp协议邮件发送)
  18. 最终解决:win10小娜无法使用(win10 win+q 无法搜索应用程序)
  19. 【转】Xamarin.Android 入门之:Xamarin+vs2015 环境搭建
  20. 努比亚红魔5G救砖线刷教程

热门文章

  1. 深入浅出,camera v4l2理解
  2. 杂文 - 优化工作效率
  3. Hamming窗或者Hanning窗的傅里叶变换
  4. 图形学中的抗锯齿讨论以及在unity中的应用
  5. 以太坊基础快速入门;招商银行开具首张区块链电子发票;区块链在司法领域的深度运用
  6. word如何一键全选,word怎么全选所有内容(word文档的快捷键操作)
  7. 制作一个简单的logo
  8. Arch Linux的安装与常用配置
  9. 怎样把照片中的头像扶正_这五种微信头像的女人最受欢迎,有你吗?
  10. 北大计算机普博申请,北京大学2018级博士研究生试行住宿申请制