在servlet中生成验证码

红太狼 2022-05-20 07:58 245阅读 0赞

验证码

验证码的作用就是防止机器人的无限注册,导致本地数据库瞬间爆炸.今天学习servlet中生成验证码.

思路

  • 后台servlet专门生成验证码
  • 前台,img中src指向这个servlet的映射链接,从servlet中获取这个图片资源

代码

后台代码:

  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. BufferedImage bfi = new BufferedImage(80, 25, BufferedImage.TYPE_INT_RGB);
  3. Graphics2D graphics = (Graphics2D) bfi.getGraphics();
  4. // 设置背景色
  5. graphics.setColor(Color.WHITE);
  6. graphics.fillRect(0, 0, 80, 25);
  7. // 设置边框
  8. graphics.setColor(Color.BLACK);
  9. graphics.drawRect(0, 0, 80-1, 25-1);
  10. String str = drawRandomNum(graphics);
  11. drawPoint(bfi);
  12. drawInfluencedLine(graphics);
  13. //禁用缓存
  14. response.setHeader("expries", "-1");
  15. response.setHeader("Cache-Control", "no-cache");
  16. response.setHeader("Pragma", "no-cache");
  17. response.setHeader("content-type","image/jpeg");
  18. // imageIO
  19. ImageIO.write(bfi, "jpg", response.getOutputStream());
  20. }
  21. // 画上点
  22. private void drawPoint(BufferedImage bfi) {
  23. int area = (int) (0.02 * 80 * 25);
  24. for (int i = 0; i < area; ++i) {
  25. int x = (int) (Math.random() * 80);
  26. int y = (int) (Math.random() * 25);
  27. bfi.setRGB(x, y, (int) (Math.random() * 255));
  28. }
  29. }
  30. private void drawInfluencedLine(Graphics2D g) {
  31. //设置验证码中的干扰线
  32. for (int i = 0; i < 3; i++) {
  33. Random random = new Random();
  34. //随机获取干扰线的起点和终点
  35. int xstart = random.nextInt(80);
  36. int ystart = random.nextInt(25);
  37. int xend = random.nextInt(80);
  38. int yend = random.nextInt(25);
  39. g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
  40. g.drawLine(xstart, ystart, xend, yend);
  41. }
  42. }
  43. // 生成随机数旋转后写入
  44. private String drawRandomNum(Graphics2D g) {
  45. char[] chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".toCharArray();
  46. Random random = new Random();
  47. int index;
  48. StringBuilder builder = new StringBuilder();
  49. for (int i = 0; i < 4; i++) {
  50. // 从字符数组中获得随机字符
  51. index = random.nextInt(chars.length);
  52. String value = chars[index] + "";
  53. // 设置随机字符的颜色
  54. g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
  55. // 字体格式
  56. Font font = new Font(null, Font.BOLD, 20);
  57. g.setFont(font);
  58. //生成-30~30之间的数字
  59. int dgree = random.nextInt(60) - 30;
  60. //旋转
  61. g.rotate(dgree * Math.PI / 180, i * 20 + 2, 23);
  62. // 写入字符
  63. g.drawString(value, i * 20 + 2, 20);
  64. // 把画笔再转回去,免得影响下次的弧度
  65. g.rotate(-dgree * Math.PI / 180, i * 20 + 2, 23);
  66. builder.append(value);
  67. }
  68. return builder.toString();
  69. }

前台代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h2>这是1.html</h2>
  9. <img src="/jsp/ServletDemo1">
  10. </body>
  11. </html>

效果图:
这里写图片描述

总结

这种验证码的代码,最多也就用个这么一个位置,写好了,之后就可以复用了,用的不是那么多把.直接copy过去就行了.我自己模仿写着大概用了2个小时之久- -,拿去用吧~

缺少:

  • 如何验证?
  • 如果前台生成验证码呢?比如js之类的,ajax?

发表评论

表情:
评论列表 (有 0 条评论,245人围观)

还没有评论,来说两句吧...

相关阅读