效果展示
一、网页代码
注意: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);
}
}