JCaptcha 开源的验证码组件

官方getting start指导:5 minutes application integration tutorial
http://jcaptcha.octo.com/confluence/display/general/5+minutes+application+integration+tutorial

新建Maven工程:

输入项目名称等选项:

添加dependiencies

添加完之后在重新生成Maven工程的时候出现下面的错误:
    Missing artifact com.jhlabs:imaging:jar:01012005:compile
显然是jcaptcha所倚赖的一个jar包不在常用的仓库里面,后来在其官方网站 上终于找到一个包含此包的仓库地址

<repositories>
  	<repository>
  		<id>atlassian</id>
  		<name>atlassian</name>
  		<url>http://repository.atlassian.com/maven2</url>
  	</repository>
  </repositories>
 

Implement a CaptchaService
新建类:CaptchaServiceSingleton.java

package net.hubs1.web;

import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
import com.octo.captcha.service.image.ImageCaptchaService;

public class CaptchaServiceSingleton {

	private static ImageCaptchaService instance = new DefaultManageableImageCaptchaService();

	public static ImageCaptchaService getInstance() {
		return instance;
	}
}

新建Servlet类:ImageCaptchaServlet

package net.hubs1.web.servlet;

import com.octo.captcha.service.CaptchaServiceException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.hubs1.web.CaptchaServiceSingleton;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;


public class ImageCaptchaServlet extends HttpServlet {


    public void init(ServletConfig servletConfig) throws ServletException {

        super.init(servletConfig);

    }


    protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {

       byte[] captchaChallengeAsJpeg = null;
       // the output stream to render the captcha image as jpeg into
        ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
        try {
        // get the session id that will identify the generated captcha.
        //the same id must be used to validate the response, the session id is a good candidate!
        String captchaId = httpServletRequest.getSession().getId();
        // call the ImageCaptchaService getChallenge method
            BufferedImage challenge =
                    CaptchaServiceSingleton.getInstance().getImageChallengeForID(captchaId,
                            httpServletRequest.getLocale());

            // a jpeg encoder
            JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream);
            jpegEncoder.encode(challenge);
        } catch (IllegalArgumentException e) {
            httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        } catch (CaptchaServiceException e) {
            httpServletResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            return;
        }

        captchaChallengeAsJpeg = jpegOutputStream.toByteArray();

        // flush it in the response
        httpServletResponse.setHeader("Cache-Control", "no-store");
        httpServletResponse.setHeader("Pragma", "no-cache");
        httpServletResponse.setDateHeader("Expires", 0);
        httpServletResponse.setContentType("image/jpeg");
        ServletOutputStream responseOutputStream =
                httpServletResponse.getOutputStream();
        responseOutputStream.write(captchaChallengeAsJpeg);
        responseOutputStream.flush();
        responseOutputStream.close();
    }
}
 
把Servlet配置到web.xml文件中:
 
  <servlet>
  	<servlet-name>jcaptcha</servlet-name>
  	<servlet-class>net.hubs1.web.servlet.ImageCaptchaServlet</servlet-class>
  	<load-on-startup>0</load-on-startup>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>jcaptcha</servlet-name>
  	<url-pattern>/jcaptcha</url-pattern>
  </servlet-mapping>
 

修改index.jsp文件:

<%@ page language="java" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>jcaptcha example</title>
  </head>
  <body>
    <form action="testjcaptcha">
    	<label for="j_captcha_response">请填写验证码:</label><br/>
    	<img src="jcaptcha">
		<input type='text' name='j_captcha_response' value=''>
    	<input type="submit" value="提交">
    </form>
  </body>
</html>
 

新建验证Servle类:

package net.hubs1.web.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.hubs1.web.CaptchaServiceSingleton;

import com.octo.captcha.service.CaptchaServiceException;

public class ValidationServlet extends HttpServlet {

	public void init(ServletConfig servletConfig) throws ServletException {
		super.init(servletConfig);
	}

	protected void doGet(HttpServletRequest httpServletRequest,
			HttpServletResponse httpServletResponse) throws ServletException, IOException {
		Boolean isResponseCorrect = Boolean.FALSE;
		// remenber that we need an id to validate!
		String captchaId = httpServletRequest.getSession().getId();
		// retrieve the response
		String response = httpServletRequest.getParameter("j_captcha_response");
		// Call the Service method
		try {
			isResponseCorrect = CaptchaServiceSingleton.getInstance().validateResponseForID(
					captchaId, response);
		} catch (CaptchaServiceException e) {
			// should not happen, may be thrown if the id is not valid
		}

		httpServletResponse.setContentType("text/html;charset=utf-8");
		PrintWriter out = httpServletResponse.getWriter();
		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>验证结果:</TITLE></HEAD>");
		out.println("  <BODY>");
		if(isResponseCorrect == Boolean.TRUE){
			out.print("验证通过!");
		}else {
			out.print("验证失败!");
		}
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();

	}

	protected void doPost(HttpServletRequest httpServletRequest,
			HttpServletResponse httpServletResponse) throws ServletException, IOException {
		doGet(httpServletRequest, httpServletResponse);
	}
}
 

把验证Servlet配置到web.xml文件中:

  <servlet>
  	<servlet-name>testjcaptcha</servlet-name>
  	<servlet-class>net.hubs1.web.servlet.ValidationServlet</servlet-class>
  	<load-on-startup>0</load-on-startup>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>testjcaptcha</servlet-name>
  	<url-pattern>/testjcaptcha</url-pattern>
  </servlet-mapping>
 


在Pom.xml中添加Web服务器:Jetty插件

修改Pom.xml,在<build>/<plugins>标签下添加如下内容(为了解决“ 警告:com.sun.image.codec.jpeg.JPEGCodec 是 Sun 的专用 API,可能会在未来版本中删除”)

	<plugin>
    		<groupId>org.apache.maven.plugins</groupId>
    		<artifactId>maven-compiler-plugin</artifactId>
    		<configuration>
    			<compilerArguments>
    				<verbose/>
					<bootclasspath>${java.home}/lib/rt.jar</bootclasspath>
    			</compilerArguments>
    		</configuration>
    	</plugin>
 

选中Pom.xml文件,按下 Alt + Shift + X , M 键,弹出运行配置窗口:
在Goals中输入:clean package jetty:run

运行。
测试:http://localhost:8080/jcaptchaTest/
网页效果:

猜你喜欢

转载自lj-zhu.iteye.com/blog/1028970