Educoder Java生成验证码 第1关:使用Servlet生成验证码
任务描述
本关任务:使用servlet生成验证码。
相关知识
验证码在我们登陆、注册网站,火车票买票的时候经常会见到的,为什么要有验证码呢?可能很多人都会有这个疑问。
但是作为开发者,可能我们更多的就会关注怎么生成验证码了。
要了解如何生成验证码,我们首先要知道什么是验证码,网站为什么需要它。
为什么要有验证码,什么是验证码
我们经常需要在网站或者应用程序中填写验证码,不过作为用户而言其实我们一点都不喜欢验证码,因为有时候老容易填错。
为什么这个影响用户体验的东西还是一直存在呢?
肯定是有道理的。
一个网站除了我们人操作电脑可以登录之外,使用JavaScript代码和一些脚本语言也是可以登录的,但是我们开发网站是给人用的而不是给机器使用的,我们想象一个网站如果没有验证码,我们只需要编写一段脚本就可以无限次数的登陆某个网站,这样无数次的尝试就可以暴力破解用户的密码,如果是注册行为那就会给网站制造很多垃圾信息,这个就会对该网站造成极大的资源浪费,严重的可能会让这个网站崩溃,所以就有了验证码。
说白了,验证码就是用来判断是人在操作还是机器在操作。
如何使用Servlet生成验证码
在Java中我们可以在Web项目中使用Servlet来生成验证码,流程是:前端请求验证码servlet对应的地址,后端servlet收到请求,生成一串字符作为验证码,存入到Session中,最后将验证码作为一张图片返回给前端。前端填写了验证码提交到服务器来验证。
我们看一个示例,你也可以根据这个示例在右侧编辑器中一步一步实现验证码的功能。
项目和servlet已经创建好了,我们首先在web.xml文件中注册servlet。
如下:
在servlet的doGet()方法中编写代码实现生成图片验证码:
分为如下步骤:
-
定义图像数据缓冲区(
BufferedImage); -
创建图片对象;
-
创建绘制工具(
Graphics); -
生成随机数,存入到
session中; -
使用
Graphics绘制图形; -
将验证码通过图像输出流(
ImageIO)输出到客户端; -
最后输入验证码地址即可访问单验证码。
具体代码如下:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 使用验证码的步骤// 定义图片的宽高int height = 20;int width = 60;BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 绘图工具Graphics graphics = image.getGraphics();// 绘制矩形graphics.setColor(getRandColor());// 绘制矩形背景 前两个参数 是 x y的坐标graphics.fillRect(0, 0, width, height);// 设置文字的颜色 为白色graphics.setColor(Color.WHITE);String yzm = "";// 生成四个随机数字并且画在图片上for (int i = 1; i <= 4; i++) {// 生成随机数字并且显示到页面上int number = new Random().nextInt(10);yzm += number;graphics.drawString(number + "", 10 * i, 10);}// 将验证码放入Httpsession中HttpSession session = req.getSession();session.setAttribute("sessionYzm", yzm);// 将验证码图片输出到客户端ImageIO.write(image, "jpg", resp.getOutputStream());}// 获取随机颜色private Color getRandColor() {int red = new Random().nextInt(255);int green = new Random().nextInt(255);int blue = new Random().nextInt(255);return new Color(red, green, blue);}

浙公网安备 33010602011771号