如何在网页上生成验证码?

在平时的网站的注册和登录的时候我们经常会遇到要填写验证码的情况,验证码的存在是保护网站系统的一个良好的方式,今天我就来谈一谈我生成验证码的一些心得。

整体的使用思路:

  • 首先在Servlet的doGet方法中设置响应头的内容response.setHeader("Content-type", "image/jpeg");这是针对于图片信息的特有的方式。
  • 创建一个缓冲的图片流
  • 配置一些必要的参数,如字体,画笔等
  • 调用ImageIO的write方法,并发送给客户端生成的图片信息

下面就来深入的研究一下这些方法。

创建一个缓冲的图片流

先看一看API帮助文档吧
如何在网页上生成验证码?_第1张图片
这样指定一下相关的参数和图片类型。

配置一些必要的参数,如字体,画笔等

如何在网页上生成验证码?_第2张图片
首先我们可以直接看到的是这个方法会返回一个Graphics对象,直接的操作就可以完成相应的内容,但是要想做一些更加精细化的操作,我们就可以借助于Graphics2D(帮助文档上的注解明显可以看得出这个方法就是在返回一个Graphics2D对象,这正好是我们所需要的)
如何在网页上生成验证码?_第3张图片

调用ImageIO的write方法,并发送给客户端生成的图片信息

如何在网页上生成验证码?_第4张图片
我们只需要传进去这个方法所需要的参数就好了!

至此,原理部分完成。下面请看一个具体的小例子吧。

案例展示

  • 原始输出:
private void showImage1(HttpServletResponse response) throws IOException {
        response.setHeader("Content-type", "image/jpeg");

        BufferedImage image = new BufferedImage(1000,500,BufferedImage.TYPE_INT_RGB);
        Graphics graphics = image.getGraphics();
        graphics.setColor(Color.GREEN);
        graphics.setFont(new Font(null,Font.ITALIC,200));
        graphics.drawString("123456789", 0, 200);
        ImageIO.write(image, "jpg", response.getOutputStream());
    }

结果如下:
如何在网页上生成验证码?_第5张图片

  • 改变背景的输出:
    代码如下:
private void showImage2(HttpServletResponse response) throws IOException {
        response.setHeader("Content-type", "image/jpeg");

        BufferedImage image = new BufferedImage(1000,500,BufferedImage.TYPE_INT_RGB);

        Graphics2D graphics2D = (Graphics2D) image.getGraphics();

        graphics2D.fillRect(0, 0, 1000, 500);
        graphics2D.setFont(new Font(null,Font.BOLD,200));
        graphics2D.setColor(Color.GREEN);
        graphics2D.drawString("123456789", 0, 200);
        ImageIO.write(image, "jpg", response.getOutputStream());
    }

结果展示:
如何在网页上生成验证码?_第6张图片

总结:

  • 掌握大致的流程,了解相关API的使用方法就可以完成这样的操作
  • 改进方向,将生成的验证码存储到session中,然后利用键值对的方式保存,在登陆的时候进行验证就是我们开发中会使用到的情景。
  • 好了,今天的内容就到这里吧!

你可能感兴趣的:(servlet,图片,字体,验证码)