• 手写验证码(附代码)



    前言

    提示:这里可以添加本文要记录的大概内容:


    一、验证码概述

    1.1 验证码的作用

    为了防止机器人的破坏性操作(恶意表单注册),可以使用验证码技术来防止恶意的发送数据。(防止数据库崩溃)

    • 验证码本质上是一张动态产生的图片。
    • 图片的内容会随着程序的运行而随机生成。

    1.2 验证码的绘制

    • 验证码图片的生成需要使用java提供的与绘图有关的一系列API。
    • 要想绘图,需要画板,画笔,颜料,背景色,字体等多种类对象配合完成。

    1.3 验证码的手写步骤

    1. 创建—对象,在内存中图片(验证码图片对象)
    2. 美化图片。
    3. 将图片输出到页面展示。

    二、代码实现

    1. 验证码的servlet代码:
    package com.qst.servlet;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.io.OutputStream;
    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;
    
    public class CodeServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	public void service(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    	        //创建一个空白图片
    		  BufferedImage image=new BufferedImage(100, 30, BufferedImage.TYPE_INT_RGB);
    		  //获取图片画笔
    		  Graphics g=image.getGraphics();
    		  Random r=new Random();
    		  //设置画笔颜色
    		   g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
    		   //填充矩形作为背景
    		   g.fillRect(0, 0, 100, 30);
    		   g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
    		   String str=getNumber(7);
    		    g.setFont(new Font(null,Font.BOLD+Font.ITALIC,24));
    		   //画验证码数字
    		   g.drawString(str, 5, 25);
    		   //绘制8条干扰线
    		   for(int i=0;i<8;i++){
    			   g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
    			   g.drawLine(r.nextInt(100), r.nextInt(30),r.nextInt(100), r.nextInt(30));
    		   }
    		   //告诉浏览器解析成图片
    		   response.setContentType("image/jpeg");
    		      OutputStream out= response.getOutputStream();
    		      ImageIO.write(image, "jpeg", out);
    		      out.close();
    	}
    	
    	  public   String getNumber(int n){
    		  String str="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    		  String number="";
    		  Random r=new Random();
    		   for(int i=0;i<n;i++){
    			   number=number+str.charAt(r.nextInt(str.length()));
    		   }
    		  return number;
    	  }
    	  
    	
    
    }
    
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    1. 页面的servlet:
    
    package com.qst.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    public class LoginServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	
    	public void service(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		request.setCharacterEncoding("UTF-8");
    		response.setContentType("text/html;charset=utf-8");
    		 //获取填写的验证码信息
    		  String valText=request.getParameter("validate");
    		 //获取验证码图片上的信息
    		   String code=(String)request.getSession().getAttribute("code");
    		   PrintWriter out=response.getWriter();
    		   if(code.equalsIgnoreCase(valText)){
    			   out.println("验证码输入正确!");
    		   }else{
    			   out.println("验证码输入错误!");
    		   }
    	}
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    1. JS 代码
    <%@ page language="java"   contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>验证码窗口</title>
    </head>
    <body>
    <fieldset>
      <legend>验证码窗口</legend>
      <form action="login" method="post" >
      验证码:<input type="text" name="validate"  size="10"/><img alt="" src="code" onclick="this.src='code?'+Math.random();"><br/><br/>
     <input type="submit" value="提交"/>
     </form>
    </fieldset>
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

  • 相关阅读:
    探索TiDB Lightning源码来解决发现的bug
    OVER(PARTITION BY ***)用法,力扣mysql算法题,每日一题
    虹科工业树莓派应用案例之在石油开采中的应用
    Biu~送你 20 个提供远程工作的网站,都很棒
    MySQL最大建议行数2000w, 靠谱吗?
    考公顺序步骤
    (附源码)ssm高考志愿智能选择系统 毕业设计 134565
    脉冲神经网络入门
    怎么让英文大预言模型支持中文?(二)继续预训练
    函数式编程------JDK8新特性
  • 原文地址:https://blog.csdn.net/qq_45821255/article/details/125444324