【java】Java验证码功能实现

桃扇骨 2022-07-12 03:09 429阅读 0赞

一、前言

  1. 验证码可以说在我们生活中已经非常普遍了,任何一个网站,任何一个App都会有这个功能,但是为啥要有这个呢?如何做才能做出来呢?下面小编会带领大家一起用java完成一个验证码的功能。

二、验证码的作用

  1. 一般可以防止有人利用机器人自动批量注册、对特定的注册用户用特定程序暴力破解方式进行不断的登录,灌水。因为验证码是一个混合了数字和符号的图片,人眼看起来都费劲,机器识别起来就更难了。

三、java实现

这里写图片描述

3.1 建立验证码的servlet 类:

  1. package com.bjpowernode.drp.util.servlet;
  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.Graphics;
  5. import java.awt.image.BufferedImage;
  6. import java.io.IOException;
  7. import java.util.Random;
  8. import javax.imageio.ImageIO;
  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 javax.servlet.http.HttpSession;
  14. /** * 验证码功能生成 * @author Ares * */
  15. public class AuthImage extends HttpServlet{
  16. private static final String CONTENT_TYPE = "text/html; charset=gb2312";
  17. //设置字母的大小,大小
  18. private Font mFont = new Font("Times New Roman", Font.PLAIN, 17);
  19. public void init() throws ServletException
  20. {
  21. super.init();
  22. }
  23. Color getRandColor(int fc,int bc)
  24. {
  25. Random random = new Random();
  26. if(fc>255) fc=255;
  27. if(bc>255) bc=255;
  28. int r=fc+random.nextInt(bc-fc);
  29. int g=fc+random.nextInt(bc-fc);
  30. int b=fc+random.nextInt(bc-fc);
  31. return new Color(r,g,b);
  32. }
  33. public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
  34. {
  35. response.setHeader("Pragma","No-cache");
  36. response.setHeader("Cache-Control","no-cache");
  37. response.setDateHeader("Expires", 0);
  38. //表明生成的响应是图片
  39. response.setContentType("image/jpeg");
  40. int width=100, height=18;
  41. BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  42. Graphics g = image.getGraphics();
  43. Random random = new Random();
  44. g.setColor(getRandColor(200,250));
  45. g.fillRect(1, 1, width-1, height-1);
  46. g.setColor(new Color(102,102,102));
  47. g.drawRect(0, 0, width-1, height-1);
  48. g.setFont(mFont);
  49. g.setColor(getRandColor(160,200));
  50. //画随机线
  51. for (int i=0;i<155;i++)
  52. {
  53. int x = random.nextInt(width - 1);
  54. int y = random.nextInt(height - 1);
  55. int xl = random.nextInt(6) + 1;
  56. int yl = random.nextInt(12) + 1;
  57. g.drawLine(x,y,x + xl,y + yl);
  58. }
  59. //从另一方向画随机线
  60. for (int i = 0;i < 70;i++)
  61. {
  62. int x = random.nextInt(width - 1);
  63. int y = random.nextInt(height - 1);
  64. int xl = random.nextInt(12) + 1;
  65. int yl = random.nextInt(6) + 1;
  66. g.drawLine(x,y,x - xl,y - yl);
  67. }
  68. //生成随机数,并将随机数字转换为字母
  69. String sRand="";
  70. for (int i=0;i<6;i++)
  71. {
  72. int itmp = random.nextInt(26) + 65;
  73. char ctmp = (char)itmp;
  74. sRand += String.valueOf(ctmp);
  75. g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
  76. g.drawString(String.valueOf(ctmp),15*i+10,16);
  77. }
  78. HttpSession session = request.getSession(true);
  79. session.setAttribute("rand",sRand);
  80. g.dispose();
  81. ImageIO.write(image, "JPEG", response.getOutputStream());
  82. }
  83. public void destroy()
  84. {
  85. }
  86. }

3.2 在WEB-INF文件下的web.xml配置servlet

  1. //servlet名字和位置
  2. <servlet>
  3. <servlet-name>AuthImage</servlet-name>
  4. <servlet-class>com.bjpowernode.drp.util.servlet.AuthImage</servlet-class>
  5. </servlet>
  6. //servlet 对那些映射起作用
  7. <servlet-mapping>
  8. <servlet-name>AuthImage</servlet-name>
  9. <url-pattern>/servlet/login/AuthImage</url-pattern>
  10. </servlet-mapping>

3.3 前台调用Servlet

jsp代码:

  1. <img id="img" style="cursor:pointer;" alt="验证码" src="${pageContext.request.contextPath}/servlet/login/AuthImage" onclick="changeImg()">

js:

  1. //点击验证码变换图片
  2. function changeImg(){
  3. var img =document.getElementById("img");
  4. img.src="${pageContext.request.contextPath}/servlet/login/AuthImage?d="+Math.random();
  5. return false;
  6. }

四、小结

  1. 通过这次的对验证码的学习,自己也是有了一定的认识,对整个Servlet和前台代码之间的交互,数据传输也有了很好地提升,所以以后还是要多多的学习一下这些的技巧,多多总结一下。这样知识才会扎实。

发表评论

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

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

相关阅读

    相关 JavaSwing实现验证功能

    在Web应用程序开发中,验证码(CAPTCHA)是一种常见的安全措施,用于防止自动化机器人和恶意软件对网站进行攻击。本文将介绍如何使用JavaSwing来实现验证码功能,以帮助

    相关 js实现验证功能

    \前面是拆解着讲的,不想看可以直接跳过,带注释的完整版代码和效果在后面 首先在页面中准备一个输入框,一个显示验证码的盒子和一个提交按钮 <body>

    相关 javaweb实现验证功能

    在javaweb的用户注册与登陆功能时,有时为了防止漏洞或者大量注册,可以使用验证码功能,下面是验证码的一个简单实现 验证码类 public class V

    相关 邮箱验证功能实现

    在进行实际项目的开发过程中,我们可能会遇到需要需要对用户账号密码进行找回,这时就需要我们通过邮件进行验证,从而对用户信息进行修改,下面我就将自己开发过程中的邮件发送功能简单描述