手写验证码(附代码)


前言

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


一、验证码概述

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. 页面的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. 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>

猜你喜欢

转载自blog.csdn.net/qq_45821255/article/details/125444324
今日推荐