使用java编写最常见的登录验证码

效果展示

在这里插入图片描述

一、网页代码

注意:img标签的src属性指向的是servlet代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
    <script type="text/javaScript" src="${pageContext.request.contextPath}/webpro2/js/jquery-3.4.1.min.js"></script>
</head>
<body>

	<a style="cursor: pointer" onclick="reload()">
		<img alt="加载中..." src="${pageContext.request.contextPath }/Captcha" id="img" style="width: 100px;height:35px;">
	</a>
	
	<script type="text/javascript">
		function reload(){
			//.src+"?a="+new Date().getTime(),每一次拿到的参数都是不一样的,防止每次页面只能出来一次
			document.getElementById("img").src = document.getElementById("img").src+"?a="+new Date().getTime();
		}
	</script>
	
</body>
</html>

二、编写验证码

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Captcha
 */
@WebServlet("/Captcha")
public class Captcha extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置缓存
			response.setHeader("Pragma", "No-cache");
			response.setHeader("Cache-Control", "No-cache");
			response.setDateHeader("Expires", 0);
		//注意这里输出的是图片(我用的是gif格式)
			response.setContentType("image/gif");	
		//画板
			int width = 100;
			int height = 40;
			BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//参数分别是宽、高、使用RGB颜色
		//画笔
			Graphics g = image.getGraphics();//这里可以理解为拿到一支笔
			Font font = new Font("宋体",Font.BOLD,25);//给笔设置一种字体、加粗、25号
			g.setFont(font);
		//给验证码加背景
			String imagePath = request.getServletContext().getRealPath("/download/1.gif"); 
			Image image1 = ImageIO.read(new File(imagePath));
			g.drawImage(image1, 0, 0, 100, 40, null);
		//核心部分(验证码都是从下面这个字符串里拿取得)
			String source = "0123456789abcdefghijklmABCDEFGH好人按时发生大发";
			String infor  = "";//这个变量是为了存储从循环里面拿取的字符
			for (int i = 0; i < 4; i++) {
			    //随机取一个字符
					int index =  new Random().nextInt(source.length()-1);
					char myCode = source.charAt(index);
				//让字的颜色随机
					Random random = new Random();
					g.setColor(new Color(20+random.nextInt(120),20+random.nextInt(120),20+random.nextInt(120)));//这里参数才用的是RGB三基色
				//画入文字
					g.drawString(myCode+"", 15+i*20, 20+new Random().nextInt(10));//参数1:这里myCode+"" 是为了让它转换为String;参数2:距离左边多远;参数3:使每个字符出现的高度不同
				//画入干扰线
					g.drawLine(random.nextInt(100), random.nextInt(40), random.nextInt(100), random.nextInt(40));//每一个参数代表一条干扰线
					infor += myCode;//每次拿到得字符拼接在一起
			}
		//记录到session,以备将来匹配
			request.getSession().setAttribute("infor", infor);
		//释放资源
			g.dispose();//处理此图形上下文并释放其正在使用的任何系统资源。
			OutputStream out  = response.getOutputStream();
			ImageIO.write(image,"gif", out);//使用支持给定格式的任意 ImageWriter写入图像到 OutputStream 
			out.flush();//刷新此输出流并强制任何缓冲的输出字节被写出。 
			out.close();//关闭此输出流并释放与此流相关联的任何系统资源。 

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值