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

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
时间: 2024-11-09 10:16:59

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

GOOGLE kaptcha 验证码生成插件 servlet/jsp项目中使用步骤

步骤一: 在项目中添加kaptchar的jar包,下载地址:http://code.google.com/p/kaptcha/(建议使用迅雷下载) 步骤二: 配置web.xml,详细配置如下(这里不是所有的配置,这里的参数还有很多可以酌情精简): <!-- 配置验证码插件servlet类 --> <servlet> <servlet-name>kaptcha</servlet-name> <servlet-class> com.google.co

Web---图片验证码生成教程详解-从简单到复杂-从本地到前后台

首先,我们先来看本地如何生成图片验证码的,再来写输出到网页的验证码如何实现. 先来看最简单的-实现的功能是,将一个字符串变成图片写入到文件中 实现代码: package cn.hncu.img; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOE

图形验证码实现方案(解决短信轰炸问题)

最近收到leader的一个邮件说我们的项目有短信轰炸风险.顿时让一个做技术开发的人为之一颤.今天给大家介绍一个解决这个问题的使用工具. 就是谷歌的 kaptcha 进行验证码生成和校验.闲话少说直接上代码. 1. 首先下载一个工具包 <dependency> <groupId>com.github.axet</groupId> <artifactId>kaptcha</artifactId> <version>0.0.9</ve

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

背景:之前说的自己做的项目,偷懒登录模块没加验证码,想了想还是加上,找了下tp的文档,发现是有整合进去的,特记录下. 一.实例化生成验证码的类(该方法放到IndexController里面便于访问) [php] view plaincopy /**   *    * 验证码生成   */   public function verify_c(){       $Verify = new \Think\Verify();       $Verify->fontSize = 18;       $V

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

system命令 1.首先先介绍一些system命令 windows+tab  //切换窗口 windows+R  //调出命令窗口 命令: 输入 calc  打开计算机 输入 cmd 打开命令窗口 输入 mspaint 打开画图 system是一个函数 用来运行外部的程序 格式 system("命令语句"): 需要在代码前加上头文件  #include<stdio.h>  才可以用 (1)关机命令 shutdown -s   //关机 shutdown -a  //取消关

搞懂分布式技术12:分布式ID生成方案

搞懂分布式技术12:分布式ID生成方案 ## 转自: 58沈剑 架构师之路 2017-06-25 一.需求缘起 几乎所有的业务系统,都有生成一个唯一记录标识的需求,例如: 消息标识:message-id 订单标识:order-id 帖子标识:tiezi-id 这个记录标识往往就是数据库中的主键,数据库上会建立聚集索引(cluster index),即在物理存储上以这个字段排序. 这个记录标识上的查询,往往又有分页或者排序的业务需求,例如: 拉取最新的一页消息 select message-id/

pillow基本使用及验证码生成

pillow基本使用: 1.安装pillow模块 pip install pillow 2.pillow模块的基本使用 1.创建图片 from PIL import Image?#定义使用Image类实例化一个长为400px,宽为400px,基于RGB的(255,255,255)颜色的图片img1=Image.new(mode="RGB",size=(400,400),color=(255,255,255))??#把生成的图片保存为"pic.png"格式with o

利用谷歌 kaptcha 进行验证码生成

1 package main.com.smart.controller; 2 3 import com.google.code.kaptcha.Producer; 4 import main.com.smart.utils.CaptchaProducer; 5 import main.com.smart.utils.RedisClient; 6 import org.apache.log4j.Logger; 7 import org.apache.log4j.spi.LoggerFactory;

然后我就去网上搜索“如何写网站SEO优化方案

这段时间属于网站的策划阶段,网站的定位.网站的布局以及关键词的选定 首先,需要确定自己建设一个什么样的网站.,我们当然是企业网站,然后,确定网站的关键词,确定关键词可以参考自己的竞争对手,也可以通过关键词挖掘工具选择合适的关键词,选出的关键词一定符合用户的搜索习惯,并且有一定的搜索量.最好是能够有明确转化意向的关键词. 关键词确定后,需要设计网站的整体布局,比如说首页应该放置哪些板块,你的客户最关心的是哪些内容?最想了解的是哪些信息?,这时就需要对你的客户进行分析了,比如我们做的是工业品,客户比