Educoder Java生成验证码 第1关:使用Servlet生成验证码

任务描述

本关任务:使用servlet生成验证码。

相关知识

验证码在我们登陆、注册网站,火车票买票的时候经常会见到的,为什么要有验证码呢?可能很多人都会有这个疑问。

但是作为开发者,可能我们更多的就会关注怎么生成验证码了。

要了解如何生成验证码,我们首先要知道什么是验证码,网站为什么需要它。

为什么要有验证码,什么是验证码

我们经常需要在网站或者应用程序中填写验证码,不过作为用户而言其实我们一点都不喜欢验证码,因为有时候老容易填错。

为什么这个影响用户体验的东西还是一直存在呢?

肯定是有道理的。

一个网站除了我们人操作电脑可以登录之外,使用JavaScript代码和一些脚本语言也是可以登录的,但是我们开发网站是给人用的而不是给机器使用的,我们想象一个网站如果没有验证码,我们只需要编写一段脚本就可以无限次数的登陆某个网站,这样无数次的尝试就可以暴力破解用户的密码,如果是注册行为那就会给网站制造很多垃圾信息,这个就会对该网站造成极大的资源浪费,严重的可能会让这个网站崩溃,所以就有了验证码。

说白了,验证码就是用来判断是人在操作还是机器在操作

如何使用Servlet生成验证码

Java中我们可以在Web项目中使用Servlet来生成验证码,流程是:前端请求验证码servlet对应的地址,后端servlet收到请求,生成一串字符作为验证码,存入到Session中,最后将验证码作为一张图片返回给前端。前端填写了验证码提交到服务器来验证。

我们看一个示例,你也可以根据这个示例在右侧编辑器中一步一步实现验证码的功能。

项目和servlet已经创建好了,我们首先在web.xml文件中注册servlet

如下:

servletdoGet()方法中编写代码实现生成图片验证码:

分为如下步骤:

  1. 定义图像数据缓冲区(BufferedImage);

  2. 创建图片对象;

  3. 创建绘制工具(Graphics);

  4. 生成随机数,存入到session中;

  5. 使用Graphics绘制图形;

  6. 将验证码通过图像输出流(ImageIO)输出到客户端;

  7. 最后输入验证码地址即可访问单验证码。

具体代码如下:

  1. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  2. // 使用验证码的步骤
  3. // 定义图片的宽高
  4. int height = 20;
  5. int width = 60;
  6. BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  7. // 绘图工具
  8. Graphics graphics = image.getGraphics();
  9. // 绘制矩形
  10. graphics.setColor(getRandColor());
  11. // 绘制矩形背景 前两个参数 是 x y的坐标
  12. graphics.fillRect(0, 0, width, height);
  13. // 设置文字的颜色 为白色
  14. graphics.setColor(Color.WHITE);
  15. String yzm = "";
  16. // 生成四个随机数字并且画在图片上
  17. for (int i = 1; i <= 4; i++) {
  18. // 生成随机数字并且显示到页面上
  19. int number = new Random().nextInt(10);
  20. yzm += number;
  21. graphics.drawString(number + "", 10 * i, 10);
  22. }
  23. // 将验证码放入Httpsession中
  24. HttpSession session = req.getSession();
  25. session.setAttribute("sessionYzm", yzm);
  26. // 将验证码图片输出到客户端
  27. ImageIO.write(image, "jpg", resp.getOutputStream());
  28. }
  29. // 获取随机颜色
  30. private Color getRandColor() {
  31. int red = new Random().nextInt(255);
  32. int green = new Random().nextInt(255);
  33. int blue = new Random().nextInt(255);
  34. return new Color(red, green, blue);
  35. }
posted @   Q且听风吟  阅读(698)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示