Java实现验证码的制作

来源:互联网 发布:金蝶软件技术服务 编辑:程序博客网 时间:2024/05/22 12:15

使用Servlet实现验证码

1.首先先简单的实现一个验证码:

一个验证码(CAPTCHA)包含两个部分:图片和输入框

//1.reloadCode():用于刷新验证码,变量time用于跳过IE缓存机制,使图片强制刷新//2.IE如果两次访问的是同一个网页地址,就不会刷新网页,所以在网址背后加上变量:time<script type="text/javascript">    function reloadCode(){        var time=new Date().getTime();        //请求加的参数date叫时间戳专治浏览器缓存:        document.getElementById("imageCode").src="<%=request.getContextPath()%>/servlet/ImageServlet?d="+time;    }</script><body>    验证码:<input type="text" name="checkcode"/>    <img alt="验证码" id="imageCode" src="<%=request.getContextPath()%>/servlet/ImageServlet"/>    <!--servlet/ImageServlet是ImageServlet.java的url-->    <a href="javascript:reloadCode();">看不清楚</a></body>

我们用ImageServlet.java实时生成图片,生成图片所需要的步骤如下:

1.定义BufferedImage对象  2.获得Graphics对象  3.听过Random类产生随机验证码信息  4.使用Graphics绘制图片  5.记录验证码信息到session中  6.使用ImageIO输出图片
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    BufferedImage image=new BufferedImage(68,22,BufferedImage.TYPE_INT_RGB);//实例化BufferedImage    Graphics g=image.getGraphics();    Color c=new Color(200,200,255);//验证码图片的背景颜色      g.setColor(c);    g.fillRect(0,0,68,22);//图片的边框         char[] chs="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".toCharArray();    StringBuffer sb=new StringBuffer();    Random r=new Random();    int index;//数组的下标       for(int i=0;i<4;i++){        index=r.nextInt(chs.length);//随机一个下标        //1.Color的三个参数是:R G B,random.nextInt(10)表示[0,10)中的随机整数        //2.注意10是取不到的,还有要是不加参数,随机产生的都是非常大的数字且有正又负         g.setColor(new Color(r.nextInt(88),r.nextInt(210),r.nextInt(150)));//随机一个颜色        g.drawString(chs[index]+"",15*i+3,18);//画出字符         sb.append(chs[index]);//验证码字符串     }    request.getSession().setAttribute("piccode",sb.toString());//将验证码字符串保存到session中    ImageIO.write(image,"jpg",response.getOutputStream());//向页面输出图像 }

2.现在是实现验证码的简单校验:

<script type="text/javascript">    function reloadCode(){        var time=new Date().getTime();        document.getElementById("imageCode").src="<%=request.getContextPath()%>/servlet/ImageServlet?d="+time;    }</script><body>     <form action="<%=request.getContextPath()%>/servlet/LoginServlet" method="get"><!--LoginServlet.java实现校验功能-->        验证码:<input type="text" name="checkcode"/>        <img alt="验证码" id="imageCode" src="<%=request.getContextPath()%>/servlet/ImageServlet"/>        <a href="javascript:reloadCode();">看不清楚</a><br>        <input type="submit" value="提交"/>    </form></body>
//接下来是LoginServlet.java中实现校验功能的简单代码:public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {    String piccode=(String) request.getSession().getAttribute("piccode");    String checkCode=request.getParameter("checkcode");    response.setContentType("text/html;charset=UTF-8");    PrintWriter out=response.getWriter();    if(checkCode.equals(piccode)){        out.println("验证码正确!");    }else{        out.print("验证码错误!");    }    out.flush();    out.close();}

使用开源组件Jcaptcha实现验证码

下载jcaptcha-integration-simple-servlet-sample.war(jcaptcha的例子工程)放到tomcat下,启动运行几可以看到效果

Jcaptcha:一个用来生成图形验证码的Java开源组件,使用起来也是非常的方便,与Spring组合使用,可以产生多种形式的验证码,具体使用流程如下:

1.下载并将其JAR放到类路径下  2.配置web.xml  3.写一个验证验证码的请求方法 其解压的jar文件如下:

1.下载jcaptcha所需要的jar包,或从上面的例子工程中拷贝jar包或web.xml文件等

2.用于展示验证码的auth_code_captcha.jsp如下:

<form action="submit.action" method="post">    <img src="jcaptcha.jpg" />     <input type="text" name="japtcha" value="" />    <input type="submit"/></form>

3.在web.xml的简单配置如下:

<servlet>    <servlet-name>jcaptcha</servlet-name>    <servlet-class>com.octo.captcha.module.servlet.image.SimpleImageCaptchaServlet</servlet-class></servlet><servlet-mapping>    <servlet-name>jcaptcha</servlet-name>    <url-pattern>/jcaptcha.jpg</url-pattern></servlet-mapping><!-- 处理表单提交的Servlet:--><servlet>    <servlet-name>submit</servlet-name>    <servlet-class>org.gpf.servlet.SubmitActionServlet</servlet-class></servlet><servlet-mapping>    <servlet-name>submit</servlet-name>    <url-pattern>/submit.action</url-pattern></servlet-mapping>

4.用于表单提交的Servlet(SubmitActionServlet.java):

public class SubmitActionServlet extends HttpServlet {    protected void doPost(HttpServletRequest request,HttpServletResponse response) throws Exception{               String userCaptchaResponse = request.getParameter("japtcha");        boolean captchaPassed = SimpleImageCaptchaServlet.validateResponse(request,userCaptchaResponse);             response.setContentType("text/html;charset=utf-8");        if (captchaPassed)            response.getWriter().write("验证通过!");        else {            response.getWriter().write("验证失败!");        }        response.getWriter().write("<br/><a href='auth_code_captcha.jsp'>重新验证</a>");    }}

使用开源组件Kaptcha实现验证码

它是可以配置的,也可以生成各种样式的验证码,其使用流程是:

1.下载kaptcha-2.3.jar  2.将jar包导入到项目中去  3.编写页面  4.配置web.xml  5.启动项目

1.如下是其简单应用:用于显示验证码的index.jsp:

<img alt="验证码图片" src="randomCode.jpg"><!--如果出错建议改为"/randomCode.jpg"试试--><form action="check.jsp" method="post">    <input type="text" name="imageText">    <input type="submit" value="验证"></form>

2.用于验证验证码的check.jsp:

<%    String myImageText = request.getParameter("imageText");    String key = (String)request.getSession().getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);      if(!myImageText.isEmpty() && myImageText.equals(key))        out.print("验证通过!<br />");    else        out.print("验证失败!<br />");        out.print("你输入的字符:" + myImageText + ",验证码字符:" + key);    %>

3.在web.xml中配置图片显示的Servlet:

<servlet>    <servlet-name>Kcaptcha</servlet-name>    <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class></servlet><servlet-mapping>    <servlet-name>Kcaptcha</servlet-name>    <url-pattern>/randomCode.jpg</url-pattern></servlet-mapping>

Kaptcha的详细配置介绍:

<!-- 边框: --><init-param>    <description>图片边框,yes(默认值)或者no</description>    <param-name>kaptcha.border</param-name>    <param-value>yes</param-value></init-param><init-param>    <description>边框颜色,white,black(默认),blue等</description>    <param-name>kaptcha.border.color</param-name>    <param-value>green</param-value></init-param><!-- 图片宽高: --><init-param>    <description>图片宽度</description>    <param-name>kaptcha.image.width</param-name>    <param-value>200</param-value></init-param>........................................................等等自己百度!!!

Kaptcha实现中文验证码:

查看前面的配置发现验证码字符的生成主要依靠是kaptcha.textproducer.impl这个文本实现类,查看com.google.code.kaptcha.text.impl.DefaultTextCreator的源码,发现了它继承自Configurable并实现了TextProducer接口,我们可以仿照它自定义我们自己的验证码中的文本生成器

这是实现代码:http://paste.ubuntu.com/24418282/

最后只需要在web.xml中将初始化参数由默认的文本实现类改成我们自己的实现类即可生效了:

<init-param>    <description>文本实现类</description>    <param-name>kaptcha.textproducer.impl</param-name>    <param-value>ChineseTextCreator</param-value></init-param>

Kaptcha实现算式验证码:

具体的实现步骤如下:

1.获取随机的数值将结果相加  2.将计算公式写入到验证码图片  3.将相加的结果放入到session中

因此,我们需要重写KaptchaServlet这个用于生成验证码的Servlet,这个是具体代码:http://paste.ubuntu.com/24418321/

最后是在web.xml中的具体配置如下:

<servlet-name>Kcaptcha</servlet-name><servlet-class>MyKaptchaServlet</servlet-class><init-param>    <description>文本集合</description>    <param-name>kaptcha.textproducer.char.string</param-name>    <param-value>0123456789</param-value></init-param><init-param>    <description>验证码长度</description>    <param-name>kaptcha.textproducer.char.length</param-name>    <param-value>2</param-value></init-param>
1 0