Java实现验证码(上)

时间:2022-12-22 20:40:27

           总所周知,现在登录注册各种网站账号很多都要求输入验证码。设置验证码,毫无疑问降低了用户体验,但为什么各种网站还仍然使用验证码呢?

        很明显,验证码有其特殊的作用:验证码是一种区分用户是计算机还是人的公共全自动程序。它能够防止恶意破解密码、刷票、论坛灌水、刷页等。想想看,如果没有验证码,每次登录网站只需用户名和密码,这时,一些心术不正的黑客可以利用暴力穷举的方法破解密码,而且,黑客们还可以不断刷新访问同一个网站,使其负担加重,严重时能够导致网站崩溃。所以设置验证码就成了必要了。

废话不多说,我将在这里介绍四种常见的验证码实现,分别是用jsp和servlet实现简单的字母数字验证码、利用Kaptcha组件实现验证码、中文验证码实现、算术验证码实现。

           验证码的实现可以分为几步:生成验证码并呈现出来,判断用户输入的验证码是否准确,处理结果。


(一)jsp和servlet实现简单的字母数字验证码

首先先看最终效果:

Java实现验证码(上)

最终呈现的是数字和字母的随机组合。

eclipse项目目录如下:

Java实现验证码(上)


下面来看详细实现:

①首先实现前端呈现。由于重点是后台逻辑实现,所以前端写得比较简单,只有一个表单:

Java实现验证码(上)

处理表单的类为LoginServlet,在LoginServlet中判断用户输入是否准确;验证码图片是由ImageServlet生成并呈现;用javascript实现“看不清楚”功能,点击后重新发送请求。需要注意的是,由于缓存的作用,如果只是单单再用ImageServlet生成一个,它并不会更换。要实现更换功能,可以在后面加上后缀,使得每次请求的url不同(用随机数有时会出错,具体原因请google之)。

②ImageServlet类继承HttpServlet类, 重写doGet方法。要生成验证码并以图片形式呈现,主要有以下6个步骤:

定义BufferedImage对象

获得Graphics

通过Random产生随机验证码信息

使用Graphics绘制图片

记录验证码信息到session中

使用ImageIO输出图片

代码如下:

Java实现验证码(上)

③LoginServlet比较简单,只需要通过session获取生成的验证码和用户输入的比较,然后各自处理即可。

Java实现验证码(上)


写完代码后配置好web.xml就大功告成了!!!


(二)利用Kaptcha组件实现

用Kaptcha组件来实现比较简单,因为它会帮你生成验证码图片。首先要导入Kaptcha包。

目录如下:

Java实现验证码(上)


index.jsp还是类似,现在img的src可以写固定的jpg,Kaptcha会自动帮你生成不同的图片:

Java实现验证码(上)

KaptchaServlet.java是jar包上提供的,复制过去即可。

check.jsp检查验证码是否正确,这里就不多说了,见下:

Java实现验证码(上)

最后配置web.xml文件。Kaptcha有很多的属性可以配置:验证码图片大小,文本内容等等很多很多,有兴趣的可以深入研究,这里我只给出最简单的示例:

Java实现验证码(上)


最终运行结果如下:

Java实现验证码(上)



完整代码见:https://github.com/lingd3/Captcha