** 后台验证码Servlet实现**
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;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
@WebServlet("/CheckCodeServlet")
public class CheckCodeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// response.setCharacterEncoding("utf-8");
// 设置编码格式
request.setCharacterEncoding("utf-8");
response.setContentType("application/json; charset=utf-8");
// 图片类,参数为:宽、高、图片类型。
// TYPE_INT_BGR表示一个具有 8 位 RGB 颜色分量的图像,对应于 Windows 或 Solaris 风格的 BGR 颜色模型,具有打包为整数像素的 Blue、Green 和 Red 三种颜色。
BufferedImage image = new BufferedImage(120,40,BufferedImage.TYPE_INT_BGR);
// 获取画笔
Graphics g = image.getGraphics();
// 将图片填充颜色
g.setColor(new Color(0xFF3399));
// 将颜色全部填充到图片里面
g.fillRect(0,0,120,40);
// 设置字符串用于随机生成验证码四个字母或数字
String str = "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
Random random = new Random();
for (int i = 1; i < 5; i++) {
// 随机获取一个字符
String code = str.charAt(random.nextInt(str.length())) + "";
System.out.println(code);
// 设置画笔的字体、样式等
g.setFont(new Font("",Font.BOLD,24));
// 设置画笔颜色
g.setColor(Color.ORANGE);
// 画笔以字符串形式将随机获取的字符写到 生成的图片上
g.drawString(code,19*i,27);
}
// 将图片输出到页面
ImageIO.write(image,"jpg",response.getOutputStream());
}
}
前端图片验证码页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<img src="CheckCodeServlet" onclick="fun(this)">
<script>
function fun(obj) {
// 用于每次产生不同的连接,以实现点击验证码刷新验证码图片
obj.src="CheckCodeServlet?"+ new Date();
}
</script>
</body>
</html>
最终效果