总所周知,现在登录注册各种网站账号很多都要求输入验证码。设置验证码,毫无疑问降低了用户体验,但为什么各种网站还仍然使用验证码呢?
很明显,验证码有其特殊的作用:验证码是一种区分用户是计算机还是人的公共全自动程序。它能够防止恶意破解密码、刷票、论坛灌水、刷页等。想想看,如果没有验证码,每次登录网站只需用户名和密码,这时,一些心术不正的黑客可以利用暴力穷举的方法破解密码,而且,黑客们还可以不断刷新访问同一个网站,使其负担加重,严重时能够导致网站崩溃。所以设置验证码就成了必要了。
废话不多说,我将在这里介绍四种常见的验证码实现,分别是用jsp和servlet实现简单的字母数字验证码、利用Kaptcha组件实现验证码、中文验证码实现、算术验证码实现。
验证码的实现可以分为几步:生成验证码并呈现出来,判断用户输入的验证码是否准确,处理结果。
(一)jsp和servlet实现简单的字母数字验证码
首先先看最终效果:
最终呈现的是数字和字母的随机组合。
eclipse项目目录如下:
下面来看详细实现:
①首先实现前端呈现。由于重点是后台逻辑实现,所以前端写得比较简单,只有一个表单:
处理表单的类为LoginServlet,在LoginServlet中判断用户输入是否准确;验证码图片是由ImageServlet生成并呈现;用javascript实现“看不清楚”功能,点击后重新发送请求。需要注意的是,由于缓存的作用,如果只是单单再用ImageServlet生成一个,它并不会更换。要实现更换功能,可以在后面加上后缀,使得每次请求的url不同(用随机数有时会出错,具体原因请google之)。
②ImageServlet类继承HttpServlet类, 重写doGet方法。要生成验证码并以图片形式呈现,主要有以下6个步骤:
定义BufferedImage对象
获得Graphics
通过Random产生随机验证码信息
使用Graphics绘制图片
记录验证码信息到session中
使用ImageIO输出图片
代码如下:
③LoginServlet比较简单,只需要通过session获取生成的验证码和用户输入的比较,然后各自处理即可。
写完代码后配置好web.xml就大功告成了!!!
(二)利用Kaptcha组件实现
用Kaptcha组件来实现比较简单,因为它会帮你生成验证码图片。首先要导入Kaptcha包。
目录如下:
index.jsp还是类似,现在img的src可以写固定的jpg,Kaptcha会自动帮你生成不同的图片:
KaptchaServlet.java是jar包上提供的,复制过去即可。
check.jsp检查验证码是否正确,这里就不多说了,见下:
最后配置web.xml文件。Kaptcha有很多的属性可以配置:验证码图片大小,文本内容等等很多很多,有兴趣的可以深入研究,这里我只给出最简单的示例:
最终运行结果如下:
完整代码见:https://github.com/lingd3/Captcha