在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

java 验证码生成

2016-12-20 13:15| 发布者: zhangjf| 查看: 464| 评论: 0

摘要: 验证码效果图 import java.awt.Color;import java.awt.Font;import java.io.IOException;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;import javax.imageio.ImageIO;import ...

验证码效果图

  1. import java.awt.Color;
  2. import java.awt.Font;
  3. import java.io.IOException;
  4. import java.io.OutputStream;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import javax.imageio.ImageIO;
  8. import javax.servlet.Servlet;
  9. import javax.servlet.ServletException;
  10. import javax.servlet.http.HttpServlet;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. import org.apache.commons.lang.math.RandomUtils;
  14. import nl.captcha.Captcha;
  15. import nl.captcha.Captcha.Builder;
  16. import nl.captcha.gimpy.BlockGimpyRenderer;
  17. import nl.captcha.text.producer.ChineseTextProducer;
  18. import nl.captcha.text.producer.DefaultTextProducer;
  19. import nl.captcha.text.renderer.DefaultWordRenderer;
  20. import nl.captcha.text.renderer.WordRenderer;
  21. public class CaptchaServlet extends HttpServlet implements Servlet {
  22. private static final long serialVersionUID = 1L;
  23. private static final String PARAM_HEIGHT = "height"; // 高度 默认为50
  24. private static final String PARAM_WIDTH = "width";// 宽度 默认为200
  25. private static final String PAEAM_NOISE = "noise";// 干扰线条 默认是没有干扰线条
  26. private static final String PAEAM_TEXT = "text";// 文本
  27. protected int _width = 150;
  28. protected int _height = 40;
  29. protected boolean _noise = false;
  30. protected String _text = "number:1,word:1,number:1,number:1,word:1";
  31. /**
  32. * 初始化过滤器.将配置文件的参数文件赋值
  33. *
  34. * @throws ServletException
  35. */
  36. @Override
  37. public void init() throws ServletException {
  38. if (getInitParameter(PARAM_HEIGHT) != null) {
  39. _height = Integer.valueOf(getInitParameter(PARAM_HEIGHT));
  40. }
  41. if (getInitParameter(PARAM_WIDTH) != null) {
  42. _width = Integer.valueOf(getInitParameter(PARAM_WIDTH));
  43. }
  44. if (getInitParameter(PAEAM_NOISE) != null) {
  45. _noise = Boolean.valueOf(getInitParameter(PAEAM_NOISE));
  46. }
  47. if (getInitParameter(PAEAM_NOISE) != null) {
  48. _text = String.valueOf(getInitParameter(PAEAM_TEXT));
  49. }
  50. }
  51. /**
  52. * 因为获取图片只会有get方法
  53. */
  54. @Override
  55. public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  56. Builder builder = new Captcha.Builder(_width, _height);
  57. // 增加边框
  58. // builder.addBorder();
  59. // 是否增加干扰线条
  60. if (_noise == true) {
  61. builder.addNoise();
  62. }
  63. // ----------------自定义字体大小-----------
  64. // 自定义设置字体颜色和大小 最简单的效果 多种字体随机显示
  65. List<Font> fontList = new ArrayList<Font>();
  66. fontList.add(new Font("微软 雅黑", Font.LAYOUT_NO_START_CONTEXT, 30));// 可以设置斜体之类的
  67. DefaultWordRenderer dwr = new DefaultWordRenderer(getRandomColor(), fontList);
  68. // 加入多种颜色后会随机显示 字体空心
  69. WordRenderer wr = dwr;
  70. // 增加文本,默认为5个随机字符.
  71. if (_text == null) {
  72. builder.addText();
  73. } else {
  74. String[] ts = _text.split(",");
  75. for (int i = 0; i < ts.length; i++) {
  76. String[] ts1 = ts[i].split(":");
  77. if ("chinese".equals(ts1[0])) {
  78. builder.addText(new ChineseTextProducer(Integer.parseInt(ts1[1])), wr);
  79. } else if ("number".equals(ts1[0])) {
  80. // 这里没有0和1是为了避免歧义 和字母I和O
  81. char[] numberChar = new char[] { '2', '3', '4', '5', '6', '7', '8' };
  82. builder.addText(new DefaultTextProducer(Integer.parseInt(ts1[1]), numberChar), wr);
  83. } else if ("word".equals(ts1[0])) {
  84. // 原理同上
  85. char[] numberChar = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'k', 'm', 'n', 'p', 'r',
  86. 'w', 'x', 'y' };
  87. builder.addText(new DefaultTextProducer(Integer.parseInt(ts1[1]), numberChar), wr);
  88. } else {
  89. builder.addText(new DefaultTextProducer(Integer.parseInt(ts1[1])), wr);
  90. }
  91. }
  92. }
  93. // --------------添加背景-------------
  94. // 设置背景渐进效果 以及颜色 form为开始颜色,to为结束颜色
  95. // GradiatedBackgroundProducer gbp=new GradiatedBackgroundProducer();
  96. // gbp.setFromColor(Color.yellow);
  97. // gbp.setToColor(Color.red);
  98. // 无渐进效果,只是填充背景颜色
  99. // FlatColorBackgroundProducer fbp=new
  100. // FlatColorBackgroundProducer(Color.red);
  101. // 加入网纹--一般不会用
  102. // SquigglesBackgroundProducer sbp=new SquigglesBackgroundProducer();
  103. // 没发现有什么用,可能就是默认的
  104. // TransparentBackgroundProducer tbp = new
  105. // TransparentBackgroundProducer();
  106. // builder.addBackground(gbp);
  107. // ---------装饰字体---------------
  108. // 字体边框齿轮效果 默认是3
  109. builder.gimp(new BlockGimpyRenderer(1));
  110. // 波纹渲染 相当于加粗
  111. // builder.gimp(new RippleGimpyRenderer());
  112. // 修剪--一般不会用
  113. // builder.gimp(new ShearGimpyRenderer(Color.red));
  114. // 加网--第一个参数是横线颜色,第二个参数是竖线颜色
  115. // builder.gimp(new FishEyeGimpyRenderer(Color.red,Color.yellow));
  116. // 加入阴影效果 默认3,75
  117. // builder.gimp(new DropShadowGimpyRenderer());
  118. // 创建对象
  119. Captcha captcha = builder.build();
  120. req.getSession().setAttribute("simpleCaptcha", captcha);
  121. resp.setHeader("Cache-Control", "private,no-cache,no-store");
  122. resp.setContentType("image/png");
  123. try {
  124. OutputStream os = resp.getOutputStream();
  125. ImageIO.write(captcha.getImage(), "png", os);
  126. os.close();
  127. } catch (IOException e) {
  128. e.printStackTrace();
  129. }
  130. }
  131. public Color getRandomColor() {
  132. int n = RandomUtils.nextInt(100);
  133. if (n % 3 == 1) {
  134. return Color.RED;
  135. } else if (n % 3 == 2) {
  136. return Color.BLUE;
  137. }
  138. return Color.GREEN;
  139. }
  140. }
复制代码




最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-8 14:27

Copyright 2015-2025 djqfx

返回顶部