首页 > 代码库 > Java实现验证码(上)

Java实现验证码(上)

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

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

  废话不多说,我将在这里介绍四种常见的验证码实现,分别是用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

 

Java实现验证码(上)