HttpServlet实现验证码输出功能
0、前言
验证码不能是简单的文本输出,因为这样很容易通过标签定位到你的验证码,从而失去了验证码的意义。
使用图片验证码可以有效地抑制机器人。那么如何实现图片验证码呢?
1、步骤
- 创建一张图片
- 获取图片的画笔
- 给图片上一个底色
- 获取方法中随机产生了的验证码
- 设置画笔的颜色和字体,将验证码画在图片上
- 设置浏览器的响应头的内容类型(contentType)的值,让浏览器正确解析响应内容
- 将图片写出
2、测试代
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置浏览器每3秒刷新
resp.setHeader("refresh", "3");
//创建一张图片
BufferedImage bufferedImage = new BufferedImage(80, 40, BufferedImage.TYPE_INT_RGB);
//获取该图片的画笔
Graphics2D graphics = (Graphics2D)bufferedImage.getGraphics();
//设置画笔颜色
graphics.setColor(Color.white);
graphics.fillRect(0,0,80, 40);//给图片填充底色
//获取随机验证码
String code = getCode();
//将验证码写入图片上
graphics.setColor(Color.ORANGE);
graphics.setFont(new Font(null, Font.BOLD, 30));
graphics.drawString(code, 0, 30);
//设置浏览器不缓存
resp.setDateHeader("expires", -1);
resp.setHeader("Cache-Control", "no-cache");
resp.setHeader("Pragma", "no-cache");
//设置响应头,让浏览器以图片的形式处理此次响应
resp.setContentType("image/jpg");
//将图片写出到屏幕上
ImageIO.write(bufferedImage, "jpg", resp.getOutputStream());
3、Tips
resp.setHeader("refresh", "3");
通过设置响应头里的属性值,让浏览器定时刷新。
resp.setDateHeader("expires", -1);
resp.setHeader("Cache-Control", "no-cache");
resp.setHeader("Pragma", "no-cache");
可以让浏览器不进行缓存

浙公网安备 33010602011771号