前言
java 一次性验证码
环境依赖
1.tomcat 10.0.23版本下的servlet-api.jar
提示:以下是本篇文章正文内容,注释数字顺序,代表思考顺序和阅读理解顺序。
生成验证码代码
代码如下(示例):
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class CheckServlet extends HttpServlet {
private static int WIDTH = 60; //验证码宽度
private static int HEIGHT = 20; //验证码高度
public void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
resp.setContentType("image/jpeg");
ServletOutputStream sos =resp.getOutputStream(); //(1.开启响应输出的管道)
//设置浏览器不要缓存此图片
resp.setHeader("Pragma","No-cache");
resp.setHeader("Cache-Control","no-cache");
resp.setDateHeader("Expires",0);
//创建内存图像并获得其图形上下文
BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_BGR); //用代码生成的图像,画出具有宽高和带颜色像素属性的图像(此时没有内容和背景都为空)(3.空壳容器)
//将内存图像挂载到g上,即用g获取图形上下文的操作权限
Graphics g =image.getGraphics();//获取了操作权限 才能用g这个画笔画出内容(4.)
//产生随机的认证码
char [] rands = generateCheckCode();//(5.内容的样子)
//产生图像
drawBackground(g);//(6.画背景)
drawRands(g,rands); //(7.画内容)
//结束图像的绘制过程,完成图像
g.dispose();//(8.抽出画笔,封图)
//将图像输出到客户端
ByteArrayOutputStream bos = new ByteArrayOutputStream();//开启一个管道,用来转化数据流 (9.转化图像(连通一个平级对象)
ImageIO.write(image,"JPEG",bos);//将画好的image图像,转化可传输数据流到bos上
byte [] buf = bos.toByteArray();//(10.,转为可直接传输的字节数组后,放入通往客户端的管道中,完成传输))
resp.setContentLength(buf.length);
//下面的语句也可写成:bos.writeTo(sos);
sos.write(buf);//将图像加工后的可以让浏览器识别展示的 图像放入管道中,(2.回溯加工的图像)
bos.close();//(11.)关闭管道
sos.close();//(12.)关闭管道
//将当前验证码存入Session中
session.setAttribute("check_code",new String(rands));
//直接使用下面的代码将有问题,Session对象必须在提交响应前获得
//req.getSession().setAttribute("check_code",new String(rands));
}
//生成一个4字符的验证码
private char[] generateCheckCode ()
{
//定义验证码的字符表
String chars = "0123456789abcdefghijklmnopqrstuvwxyz";
char[] rands = new char[4];
for (int i =0;i<4;i++){
int rand =(int) (Math.random()*36);
rands[i] = chars.charAt(rand); //charAt() 字符串方法 返回指定位置的单个字符
}
return rands;
}
private void drawRands (Graphics g, char[] rands){
g.setColor(Color.BLACK);
g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));
//在不同的高度上输出验证码的每个字符
g.drawString("" + rands[0],1,17);
g.drawString("" + rands[1],16,17);
g.drawString("" + rands[2],31,17);
g.drawString("" + rands[3],46,17);
System.out.println(rands);
}
private void drawBackground(Graphics g){
//画背景
g.setColor(new Color(0xDCDCDC));
g.fillRect(0,0,WIDTH,HEIGHT);
//随机产生120个干扰点
for (int i =0;i<120;i++){
int x =(int)(Math.random()*WIDTH);
int y =(int)(Math.random()*HEIGHT);
int red =(int)(Math.random()*255);
int green =(int)(Math.random()*255);
int blue =(int)(Math.random()*255);
g.setColor(new Color(red,green,blue));
g.drawOval(x,y,1,0);
}
}
}
引用示例
<img src="/lianxi01/CheckServlet" alt="">
成果
个人博客: dulred.cn(正在搭建中)
github: https://github.com/Dulred
总结
以上就是今天要讲的内容。