web.xml

Xml代码  
  1. <!DOCTYPE web-app PUBLIC
  2. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  3. "http://java.sun.com/dtd/web-app_2_3.dtd" >
  4. <web-app>
  5. <!-- ******************************************** -->
  6. <!-- **********验证码生成器************************** -->
  7. <!-- ******************************************** -->
  8. <servlet>
  9. <servlet-name>CaptchaServlet</servlet-name>
  10. <servlet-class>com.lowca.activity.web.servlet.CaptchaServlet</servlet-class>
  11. <init-param>
  12. <param-name>width</param-name>
  13. <param-value>150</param-value>
  14. </init-param>
  15. <init-param>
  16. <param-name>height</param-name>
  17. <param-value>100</param-value>
  18. </init-param>
  19. <init-param>
  20. <param-name>bgColor</param-name>
  21. <param-value>255,255,255</param-value>
  22. </init-param>
  23. <init-param>
  24. <param-name>fontColor</param-name>
  25. <param-value>0,255,0</param-value>
  26. </init-param>
  27. <init-param>
  28. <param-name>fontSize</param-name>
  29. <param-value>44</param-value>
  30. </init-param>
  31. <init-param>
  32. <param-name>fontCount</param-name>
  33. <param-value>4</param-value>
  34. </init-param>
  35. <init-param>
  36. <param-name>fontName</param-name>
  37. <param-value>宋体</param-value>
  38. </init-param>
  39. <init-param>
  40. <param-name>chars</param-name>
  41. <!-- 去掉了容易造成误解的字符,例如:i o z 和 1 0 2 -->
  42. <param-value>ABCDEFGHJKLMNPQRSTUVWXYabcdefghjkmnpqrstuvwxy3456789</param-value>
  43. </init-param>
  44. <init-param>
  45. <param-name>sessionKey</param-name>
  46. <param-value>com.lowca.activity.captcha</param-value>
  47. </init-param>
  48. <init-param>
  49. <param-name>maxRotateAngle</param-name>
  50. <param-value>40</param-value>
  51. </init-param>
  52. <init-param>
  53. <param-name>fontPadding</param-name>
  54. <param-value>-15</param-value>
  55. </init-param>
  56. </servlet>
  57. <servlet-mapping>
  58. <servlet-name>CaptchaServlet</servlet-name>
  59. <url-pattern>/captcha.jpg</url-pattern>
  60. </servlet-mapping>
  61. </web-app>

servlet类文件

Java代码  
  1. package com.lowca.activity.web.servlet;
  2. import java.awt.BasicStroke;
  3. import java.awt.Color;
  4. import java.awt.Font;
  5. import java.awt.Graphics2D;
  6. import java.awt.geom.AffineTransform;
  7. import java.awt.image.BufferedImage;
  8. import java.io.IOException;
  9. import javax.imageio.ImageIO;
  10. import javax.servlet.ServletException;
  11. import javax.servlet.ServletOutputStream;
  12. import javax.servlet.http.HttpServlet;
  13. import javax.servlet.http.HttpServletRequest;
  14. import javax.servlet.http.HttpServletResponse;
  15. import javax.servlet.http.HttpSession;
  16. import org.apache.commons.lang.StringUtils;
  17. import org.apache.commons.lang.math.NumberUtils;
  18. public class CaptchaServlet extends HttpServlet {
  19. private static final long serialVersionUID = 1L;
  20. private static final String CONTENT_TYPE = "image/jpeg";
  21. // ==================以下变量用于保存配置参数的默认值 ==================
  22. /**
  23. * 验证码的宽度
  24. */
  25. private int width = 200;
  26. /**
  27. * 验证码的高度
  28. */
  29. private int height = 150;
  30. /**
  31. * 验证码背景色
  32. */
  33. private Color bgColor = Color.WHITE;
  34. /**
  35. * 文字颜色
  36. */
  37. private Color fontColor = Color.GREEN;
  38. /**
  39. * 验证码字符字号
  40. */
  41. private int fontSize = 42;
  42. /**
  43. * 验证码字符个数
  44. */
  45. private int fontCount = 4;
  46. /**
  47. * 验证码字符间距,单位是像素
  48. */
  49. private int fontPadding = -15;
  50. /**
  51. * 验证码字符最大旋转角度
  52. */
  53. private int maxRotateAngle = 40;
  54. /**
  55. * 验证码字体
  56. */
  57. private String fontName = "宋体";
  58. /**
  59. * 验证码用到的字符
  60. */
  61. private String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  62. /**
  63. * 验证码在session中的键名
  64. */
  65. private String sessionKey = "com.lowca.activity.captcha";
  66. // ==================以下变量用于在初始化时候保存数据,减少重复计算 ==================
  67. private Font font;
  68. private char[] seedArray;
  69. private int offsetX = 0;
  70. private int offsetY = 0;
  71. /**
  72. * 生成由数字和字母随机组成的图片
  73. */
  74. protected void service(HttpServletRequest req, HttpServletResponse resp)
  75. throws ServletException, java.io.IOException {
  76. BufferedImage buffImg = new BufferedImage(width, height,
  77. BufferedImage.TYPE_INT_RGB);
  78. Graphics2D g2d = buffImg.createGraphics();
  79. g2d.setColor(bgColor);
  80. g2d.fillRect(0, 0, width, height);
  81. g2d.setPaint(fontColor);
  82. g2d.setFont(font);
  83. // 旋转文本
  84. StringBuffer randCode = new StringBuffer();
  85. for (int i = 0; i < fontCount; i++) {
  86. g2d.setStroke(new BasicStroke((float) (Math.random() * 5)));
  87. double angle = Math.random() * maxRotateAngle * Math.PI / 180;
  88. int p = (int) (Math.random() * chars.length());
  89. String word = String.valueOf(seedArray[p]);
  90. randCode.append(word);
  91. int x = offsetX + i * (fontSize + fontPadding);
  92. AffineTransform origXform = g2d.getTransform();
  93. AffineTransform newXform = (AffineTransform) (origXform.clone());
  94. newXform.rotate(angle, x, offsetY);
  95. g2d.setTransform(newXform);
  96. g2d.drawString(word, x, offsetY);
  97. g2d.setTransform(origXform);
  98. }
  99. g2d.setStroke(new BasicStroke(2.0f));
  100. int x = offsetX - (int) (20 * Math.random());
  101. int y = offsetY - (int) (20 * Math.random());
  102. int w = (int) (width - 10 - Math.random() * 6);
  103. int h = (int) (height - 10 - Math.random() * 6);
  104. int startAngle = (int) (Math.random() * 16 + 45);
  105. int arcAngle = (int) (Math.random() * 45 + 90);
  106. g2d.drawArc(x, y, w, h, startAngle, arcAngle);
  107. g2d.dispose();
  108. // 将四位数字的验证码保存到Session里面
  109. HttpSession session = req.getSession();
  110. session.setAttribute(sessionKey, randCode);
  111. // 禁止图像缓存
  112. resp.setHeader("Prama", "no-cache");
  113. resp.setHeader("Coche-Control", "no-cache");
  114. resp.setDateHeader("Expires", 0);
  115. // 将图像输出到Servelt输出流中
  116. ServletOutputStream out = resp.getOutputStream();
  117. ImageIO.write(buffImg, "jpeg", out);
  118. out.close();
  119. }
  120. public void doPost(HttpServletRequest request, HttpServletResponse response)
  121. throws ServletException, IOException {
  122. doGet(request, response);
  123. }
  124. public void doGet(HttpServletRequest request, HttpServletResponse response)
  125. throws ServletException, IOException {
  126. response.setContentType(CONTENT_TYPE);
  127. }
  128. public void init() throws ServletException {
  129. // 初始化配置参数
  130. String param = getInitParameter("width");
  131. if (NumberUtils.isDigits(param)) {
  132. width = Integer.parseInt(param);
  133. }
  134. param = getInitParameter("height");
  135. if (NumberUtils.isDigits(param)) {
  136. height = Integer.parseInt(param);
  137. }
  138. param = getInitParameter("bgColor");
  139. if (param != null && param.matches("^\\d+,\\d+,\\d+$")) {
  140. bgColor = getColor(param);
  141. }
  142. param = getInitParameter("fontColor");
  143. if (param != null && param.matches("^\\d+,\\d+,\\d+$")) {
  144. fontColor = getColor(param);
  145. }
  146. param = getInitParameter("fontSize");
  147. if (NumberUtils.isDigits(param)) {
  148. fontSize = Integer.parseInt(param);
  149. }
  150. param = getInitParameter("maxRotateAngle");
  151. if (NumberUtils.isDigits(param)) {
  152. maxRotateAngle = Integer.parseInt(param);
  153. }
  154. param = getInitParameter("fontPadding");
  155. if (param != null && param.matches("-?\\d+")) {
  156. fontPadding = Integer.parseInt(param);
  157. }
  158. param = getInitParameter("fontName");
  159. if (StringUtils.isNotBlank(param)) {
  160. fontName = param;
  161. }
  162. param = getInitParameter("chars");
  163. if (StringUtils.isNotBlank(param)) {
  164. chars = param;
  165. }
  166. param = getInitParameter("sessionKey");
  167. if (StringUtils.isNotBlank(sessionKey)) {
  168. sessionKey = param;
  169. }
  170. // 初始化状态变量
  171. font = new Font(fontName, Font.ITALIC, fontSize);
  172. seedArray = chars.toCharArray();
  173. offsetX = width / 2 - fontCount * fontSize / 2 - (fontCount - 1)
  174. * fontPadding / 2 - 8;
  175. offsetY = height / 2 + fontSize / 2 - 8;
  176. }
  177. private Color getColor(String rgb) {
  178. String[] array = rgb.split(",");
  179. return new Color(Integer.parseInt(array[0]),
  180. Integer.parseInt(array[1]), Integer.parseInt(array[2]));
  181. }
  182. }

在我的机器上,这个程序每秒钟可以产生大约83张验证码。验证码图样如下

  • 大小: 2.6 KB
  • 大小: 2.5 KB
  • 大小: 2.4 KB
  • 大小: 2.4 KB

转载于:https://www.cnblogs.com/ranzige/p/4120388.html

网友写的验证码生成方案,可防止绝大多数机械识别。相关推荐

  1. [ 浅谈web网站验证码生成方案之一 ]

    1.前言 web系统注册登录界面存在验证码验证信息已不再是新鲜事,现在的验证码生成策略有很多种,以往有单纯数字.单纯字母.字母数字组合.现在出现一些中文验证和图片验证. 要想了解中文验证和图片验证是如 ...

  2. 用Java写的验证码程序

    用java实现的给浏览器响应验证码程序.并且是实现了可以点击验证码图片换一张验证码. 最后边给出了完整的代码. //首先定义一个自己的类并且去继承HttpServlet这个类 public class ...

  3. python登录验证码生成及自动化测试规避

    在用django写论坛的时候,需要有登录及注册功能. 故就登录界面后端需要生成随机验证码并传值给前端的代码进行编写如下. 验证码生成png需要调用到python的图形库 生成注册码img import ...

  4. vue中获取到的为什么图片地址会自动拼接上localhost:8080_前端骨架屏自动生成方案(很实用!收藏)...

    来源:花满楼 https://zhuanlan.zhihu.com/p/74403911 什么是骨架屏? 什么是骨架屏呢?骨架屏(Skeleton Screen)是指在页面数据加载完成前,先给用户展示 ...

  5. thinkphp3.2 验证码生成和点击刷新验证码

    一.实例化生成验证码的类(该方法放到IndexController里面便于访问) [php] /**     * 验证码生成  */   public function verify_c(){     ...

  6. web页面 验证码 生成

    web页面 验证码 生成 kaptcha 是一个非常实用的验证码生成工具.有了它,你可以生成各种样式的验证码,因为它是可配置的.kaptcha工作的原理是调用 com.google.code.kapt ...

  7. easyui treegrid获取父节点的id_超简单的分布式ID生成方案!美团开源框架介绍

    目录 阐述背景 Leaf snowflake 模式介绍 Leaf segment 模式介绍 Leaf 改造支持 RPC 阐述背景 不吹嘘,不夸张,项目中用到 ID 生成的场景确实挺多.比如业务要做幂等 ...

  8. C++学习(二)之Visual Studio写system语句 生成可执行文件

    system命令 1.首先先介绍一些system命令 windows+tab  //切换窗口 windows+R  //调出命令窗口 命令: 输入 calc  打开计算机 输入 cmd 打开命令窗口 ...

  9. wpf page 界面渲染完成后执行自动操作_Vue项目骨架屏自动生成方案(dps)

    什么是骨架屏 什么是骨架屏呢?骨架屏(Skeleton Screen)是指在页面数据加载完成前,先给用户展示出页面的大致结构(灰色占位图),在拿到接口数据后渲染出实际页面内容然后替换掉.Skeleto ...

最新文章

  1. 为何 NLP 领域难以出现“独角兽”?
  2. BZOJ 3101: N皇后 构造
  3. babel7中 preset-env 完全使用
  4. DFT - Introduction to Test Models
  5. qt中new与delete使用示例
  6. 拓扑目的 1.Pc9通过van3访问pc10 2.Pc9通过Vlan1\Vlan2访问pc11
  7. [css] 说下你对background-size的理解,它有什么运用场景?
  8. 40个Java 多线程问题总结
  9. 485串口测试工具软件下载_串口调试助手详细讲解(结合实操),通讯问题不再是问题...
  10. java 8 localdatetime_java8 时间 LocalDateTime常用方法
  11. 万字图文 | 学会Java中的线程池,这一篇也许就够了!
  12. Linux软件包安装和卸载
  13. Host aggregate分区
  14. EntityManager方法简介
  15. 数字化医院网络终端安全管理
  16. 快压和360压缩哪个好?快压和360压缩对比介绍
  17. arnold和redshift渲染器
  18. 【原创】快速上手使用思维导图
  19. DM9006 linux driver
  20. 网络 CIDR 子网掩码 可用主机数计算

热门文章

  1. @PropertySource读取properties属性 中文乱码问题
  2. ORACLE 索引的三种状态: VALID、 N/A 、UNUSABLE
  3. Linux系统下MYSQL主从同步
  4. 新建cordova应用,插件开发教程系列(总目录)
  5. 用8张图理解Java
  6. mysql的索引和执行计划
  7. 108扫货节完美收官 在线交易额破千万
  8. 附录-实模式下1M内存
  9. 计算机机房的维护管理论文,学校计算机机房维护与管理论文
  10. 【FFMPEG系列】FFMPEG linux下集成x264