【java】Java验证码功能实现

发布时间:2023-05-10 17:18:00

一、前言

验证码在我们的生活中已经很常见了,任何网站,任何应用程序都会有这个功能,但为什么要有这个呢?如何做到这一点?下面的小边将带领您使用java来完成验证码的功能。

二、验证码的作用

一般来说,它可以防止人们使用机器人自动批量注册,并通过特定程序的暴力破解不断登录和灌溉特定注册用户。因为验证码是一张混合了数字和符号的图片,人眼看起来很难识别,所以机器更难识别。

三、java实现

 

 

 

【java】Java验证码功能实现_图片

 

3.1 建立验证码的servlet 类:
package com.bjpowernode.drp.util.servlet;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;/** * 生成验证码功能 * @author Ares * */public class AuthImage extends HttpServlet{         private static final String CONTENT_TYPE = "text/html; charset=gb2312";              ///设置字母的大小,大小              private Font mFont = new Font("Times New Roman", Font.PLAIN, 17);              public void init() throws ServletException              {                  super.init();              }              Color getRandColor(int fc,int bc)              {                  Random random = new Random();                  if(fc>255) fc=255;                  if(bc>255) bc=255;                  int r=fc+random.nextInt(bc-fc);                  int g=fc+random.nextInt(bc-fc);                  int b=fc+random.nextInt(bc-fc);                  return new Color(r,g,b);              }              public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException              {                  response.setHeader("Pragma","No-cache");                  response.setHeader("Cache-Control","no-cache");                  response.setDateHeader("Expires", 0);                  //表示生成的响应是图片                  response.setContentType("image/jpeg");                  int width=100, height=18;                  BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);                  Graphics g = image.getGraphics();                  Random random = new Random();                  g.setColor(getRandColor(200,250));                  g.fillRect(1, 1, width-1, height-1);                  g.setColor(new Color(102,102,102));                  g.drawRect(0, 0, width-1, height-1);                  g.setFont(mFont);                  g.setColor(getRandColor(160,200));                  //画随机线                  for (int i=0;i<155;i++)                  {                      int x = random.nextInt(width - 1);                      int y = random.nextInt(height - 1);                      int xl = random.nextInt(6) + 1;                      int yl = random.nextInt(12) + 1;                      g.drawLine(x,y,x + xl,y + yl);                  }                  ///从另一个方向画随机线                  for (int i = 0;i < 70;i++)                  {                      int x = random.nextInt(width - 1);                      int y = random.nextInt(height - 1);                      int xl = random.nextInt(12) + 1;                      int yl = random.nextInt(6) + 1;                      g.drawLine(x,y,x - xl,y - yl);                  }                  //生成随机数,并将随机数字转换为字母                  String sRand="";                  for (int i=0;i<6;i++)                  {                      int itmp = random.nextInt(26) + 65;                      char ctmp = (char)itmp;                      sRand += String.valueOf(ctmp);                      g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));                      g.drawString(String.valueOf(ctmp),15*i+10,16);                  }                  HttpSession session = request.getSession(true);                  session.setAttribute("rand",sRand);                  g.dispose();                  ImageIO.write(image, "JPEG", response.getOutputStream());              }              public void destroy()              {              }  }
3.2 Web-INF文件下的web.xml配置servletttel
///servlet名和位置    <servlet>        <servlet-name>AuthImage</servlet-name>        <servlet-class>com.bjpowernode.drp.util.servlet.AuthImage</servlet-class>    </servlet>    //servlet 对那些映射起作用    <servlet-mapping>        <servlet-name>AuthImage</servlet-name>        <url-pattern>/servlet/login/AuthImage</url-pattern>    </servlet-mapping>
3.3 前台调用Servletet

jsp代码:

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

js:

///点击验证码变换图片function changeImg(){    var img =document.getElementById("img");    img.src="${pageContext.request.contextPath}/servlet/login/AuthImage?d="+Math.random();    return false;}
四、小结

通过这次对验证码的学习,我也有了一定的了解,提高了整个Servlet和前台代码之间的交互和数据传输。因此,我们应该在未来学习更多这些技能并总结更多。只有这样,知识才能扎实。

上一篇 【Java】Java遍历Map键、值,获取Map大小的方法
下一篇 【分布式】CAP理论,了解一下

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题