Servlet制作验证码

来源:互联网 发布:程序员代码面试指 pdf 编辑:程序博客网 时间:2024/05/29 13:33

Servlet制作验证码

1.什么是验证码(CAPTCHA):

验证码(CAPTCHA):是一种区分用户是计算机还是人的公共全自动程序。它可以防止计算机执行一些操作。
验证码是很多网站通行的方式,本文利用简易的方式实现了这个功能。

2.为什么要使用验证码:

没使用验证码的问题:不断登陆破解密码,创建垃圾账户,刷票,提交垃圾信息。
通过验证码,由用户肉眼识别其中的验证码信息,从而区分用户是人还是计算机。

3.使用Servlet制作验证码:

4.具体代码实现:

ImageServlet:主要用到了BufferedImage类

package com.tom.servlet;import java.awt.Color;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ImageServlet extends HttpServlet{public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{BufferedImage bi = new BufferedImage(68,22,BufferedImage.TYPE_INT_RGB);//建立一个缓冲区存                放图片,三个参数分别为 长,宽,颜色类型。Graphics g = bi.getGraphics();//获取图片Color c = new Color(200,150,255);//创建颜色g.setColor(c);//设置背景颜色g.fillRect(0, 0, 68, 22);//在(0,0)绘制图形char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();//验证码展现字符数组Random rd = new Random();StringBuffer sb = new StringBuffer();int rdRange = ch.length,index;for(int i=0; i<4; i++){index = rd.nextInt(rdRange);//通过产生随机数随机选定显示字符g.setColor(new Color(rd.nextInt(88),rd.nextInt(188),rd.nextInt(240)));g.drawString(ch[index]+"",(i*15)+3 , 18);sb.append(ch[index]);}request.getSession().setAttribute("picCode", sb.toString());//将验证码写入SessionImageIO.write(bi, "JPG", response.getOutputStream());//输出}} 
JSP页面:

<html>  <head>    <base href="<%=basePath%>">        <title>My JSP 'index.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--><script type="text/javascript">function reloadCode(){var time = new Date().getTime();document.getElementById("imageCode").src="<%=request.getContextPath()%>/servlet/ImageServlet?d="+time;}//实现点击“看不清”的方法——这里需要注意的是,IE浏览器对于同一个请求路径,默认是不去请求新的资源的,他会到缓存中去拿对应的内容,解决的方法就是给请求的路径加一个随机数,让IE适中认为这是一个新的请求。本文中是加个时间。</script>  </head>    <body>  <form action="<%=request.getContextPath()%>/servlet/LoginServlet" method="get">    验证码:<input id="checkCode" name="checkCode" type="text">    <img alt="验证码" id="imageCode" src="<%=request.getContextPath()%>/servlet/ImageServlet">    <a href="javascript:reloadCode();">看不清楚</a><br>    <input type="submit" value="提交">  </body>  </form></html>
验证码验证LoginServlet:

package com.tom.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 验证码验证 * @author LGQ * @date 2016年11月22日 */public class LoginServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String picCode = (String)request.getSession().getAttribute("picCode");String checkCode = request.getParameter("checkCode").toUpperCase();response.setContentType("text/html;charset=UTF-8");//设置输出格式PrintWriter out = response.getWriter();if(picCode.equals(checkCode)){out.print("验证码输入正确");}else{out.print("验证码输入错误");}out.flush();//输出流刷新out.close();//输出流资源关闭}}

5.总结:

以上就是简单实现Servlet制作验证码的步骤,如果有错误,请联系我。

也可以使用开源组件来实现:

*Jcaptcha:一个用来生成图形验证码的Java开源组件,使用起来也是非常的简单方便。与
  Spring组合使用,可产生多种形式的验证码。
*Kaptcha:一个非常实用的验证码生成工具,有了它,你可以生成各式各样的验证码,因为
  它是可配置的。
                                                                                                                                            即便一周都是阴天
                                                                                                                                            也坚信明天的阳光




1 0