HttpServlet实现验证码输出功能

0、前言

验证码不能是简单的文本输出,因为这样很容易通过标签定位到你的验证码,从而失去了验证码的意义。

使用图片验证码可以有效地抑制机器人。那么如何实现图片验证码呢?

1、步骤

  1. 创建一张图片
  2. 获取图片的画笔
  3. 给图片上一个底色
  4. 获取方法中随机产生了的验证码
  5. 设置画笔的颜色和字体,将验证码画在图片上
  6. 设置浏览器的响应头的内容类型(contentType)的值,让浏览器正确解析响应内容
  7. 将图片写出

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");
可以让浏览器不进行缓存
posted @ 2020-08-27 22:30  LIFue  阅读(130)  评论(0)    收藏  举报