`
wwwzhouhui
  • 浏览: 358920 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jcaptcha学习spring整合

阅读更多
  继续,上篇jcaptcha学习,现在项目中用SPRING 比较多所以整合了一下。其中的部分代码是参考一个jeecms项目的,讲其中的jcaptcha验证码这块剥离出来。
  项目在上篇基础上编写的,部分代码是上篇中的代码(偷懒了)
1.用到得JAR
   commons-logging.jar,jcaptcha-all-1.0-RC6.jar,spring-beans-2.5.6.jar
   spring-context-2.5.6.jar,spring-core-2.5.6.jar,spring-web-2.5.6.jar
2.applicationContext.xml
  
 
 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"
	>
	<!--验证码生成器-->
	<bean id="imageCaptchaService" class="com.spring.CaptchaService">
		<constructor-arg type="com.octo.captcha.service.captchastore.CaptchaStore" index="0">
			<ref bean="fastHashMapCaptchaStore"/>
		</constructor-arg>   
		<!--which captcha Engine you use-->   
		<constructor-arg type="com.octo.captcha.engine.CaptchaEngine" index="1">
			<ref bean="captchaEngineEx"/>
		</constructor-arg>   
		<constructor-arg index="2">   
			<value>180</value>   
		</constructor-arg>   
		<constructor-arg index="3">   
			<value>100000</value>   
		</constructor-arg>   
		<constructor-arg index="4">   
			<value>75000</value>   
		</constructor-arg>  
	</bean>
	<bean id="fastHashMapCaptchaStore" class="com.octo.captcha.service.captchastore.FastHashMapCaptchaStore"/>   
	<!--you can define more than one captcha engine here -->   
	<bean id="captchaEngineEx" class="com.spring.CaptchaEngineEx"/>  
</beans>

3. web.xml
 <?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			classpath:applicationContext.xml
		</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<!--  
	<servlet>  
        <servlet-name>jcaptcha</servlet-name>  
        <servlet-class>com.code.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>
	-->
	
	<servlet>  
        <servlet-name>jcaptcha2</servlet-name>  
        <servlet-class>com.spring.ImageCaptchaServlet</servlet-class>  
        <load-on-startup>0</load-on-startup>  
    </servlet>  
	<servlet-mapping>  
        <servlet-name>jcaptcha2</servlet-name>  
        <url-pattern>/jcaptcha</url-pattern>  
	</servlet-mapping>  
	<!--
	<servlet>  
        <servlet-name>checkjcaptcha</servlet-name>  
        <servlet-class>com.code.ValidationServlet</servlet-class>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
	<servlet-mapping>  
        <servlet-name>checkjcaptcha</servlet-name>  
        <url-pattern>/validateAction</url-pattern>  
	</servlet-mapping>
	-->
	<servlet>  
        <servlet-name>checkjcaptcha2</servlet-name>  
        <servlet-class>com.spring.ValidationServlet</servlet-class>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
	<servlet-mapping>  
        <servlet-name>checkjcaptcha2</servlet-name>  
        <url-pattern>/validateAction</url-pattern>  
	</servlet-mapping>
	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

4.java 代码
   自定义生成代码部分
   CaptchaEngineEx.java
 
package com.spring;

import java.awt.Color;

import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;
import com.octo.captcha.component.image.backgroundgenerator.GradientBackgroundGenerator;
import com.octo.captcha.component.image.color.SingleColorGenerator;
import com.octo.captcha.component.image.fontgenerator.FontGenerator;
import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator;
import com.octo.captcha.component.image.textpaster.DecoratedRandomTextPaster;
import com.octo.captcha.component.image.textpaster.TextPaster;
import com.octo.captcha.component.image.textpaster.textdecorator.BaffleTextDecorator;
import com.octo.captcha.component.image.textpaster.textdecorator.LineTextDecorator;
import com.octo.captcha.component.image.textpaster.textdecorator.TextDecorator;
import com.octo.captcha.component.image.wordtoimage.ComposedWordToImage;
import com.octo.captcha.component.image.wordtoimage.WordToImage;
import com.octo.captcha.component.word.wordgenerator.RandomWordGenerator;
import com.octo.captcha.component.word.wordgenerator.WordGenerator;
import com.octo.captcha.engine.image.ListImageCaptchaEngine;
import com.octo.captcha.image.gimpy.GimpyFactory;

/***********************************************************************   
 *   
 *   CaptchaEngineEx.java     
 *   @copyright       Copyright:   2009-2012     
 *   @creator         周辉<br/>   
 *   @create-time   Jun 18, 2009   2:41:12 PM   
 *   @revision         $Id:     *   
 ***********************************************************************/
public class CaptchaEngineEx extends ListImageCaptchaEngine {

	protected void buildInitialFactories() {
		// Set Captcha Word Length Limitation which should not over 6
		Integer minAcceptedWordLength = new Integer(4);
		Integer maxAcceptedWordLength = new Integer(5);
		// Set up Captcha Image Size: Height and Width
		Integer imageHeight = new Integer(40);
		Integer imageWidth = new Integer(100);

		// Set Captcha Font Size
		Integer minFontSize = new Integer(20);
		Integer maxFontSize = new Integer(22);
		// We just generate digit for captcha source char Although you can use
		// abcdefghijklmnopqrstuvwxyz
		WordGenerator wordGenerator = new RandomWordGenerator("0123456789");

		// cyt and unruledboy proved that backgroup not a factor of Security. A
		// captcha attacker won't affaid colorful backgroud, so we just use
		// white
		// color, like google and hotmail.
		BackgroundGenerator backgroundGenerator = new GradientBackgroundGenerator(
				imageWidth, imageHeight, Color.white, Color.white);

		// font is not helpful for security but it really increase difficultness
		// for
		// attacker
		FontGenerator fontGenerator = new RandomFontGenerator(minFontSize,
				maxFontSize);
		// Note that our captcha color is Blue
		SingleColorGenerator scg = new SingleColorGenerator(Color.blue);

		// decorator is very useful pretend captcha attack. we use two line text
		// decorators.

		LineTextDecorator lineDecorator = new LineTextDecorator(1, Color.blue);
		// LineTextDecorator line_decorator2 = new LineTextDecorator(1,
		// Color.blue);
		TextDecorator[] textdecorators = new TextDecorator[1];

		textdecorators[0] = lineDecorator;
		// textdecorators[1] = line_decorator2;

		TextPaster textPaster = new DecoratedRandomTextPaster(
				minAcceptedWordLength, maxAcceptedWordLength, scg,
				new TextDecorator[] { new BaffleTextDecorator(new Integer(1),
						Color.white) });

		// ok, generate the WordToImage Object for logon service to use.
		WordToImage wordToImage = new ComposedWordToImage(fontGenerator,
				backgroundGenerator, textPaster);
		addFactory(new GimpyFactory(wordGenerator, wordToImage));

	}

}

生成图片的servlet
ImageCaptchaServlet.JAVA
package com.spring;

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

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 org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

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

/***********************************************************************   
 *   
 *   ImageCaptchaServlet.java     
 *   @copyright       Copyright:   2009-2012     
 *   @creator         周辉<br/>   
 *   @create-time   Jun 18, 2009   2:44:15 PM   
 *   @revision         $Id:     *   
 ***********************************************************************/
@SuppressWarnings("serial")
public class ImageCaptchaServlet extends HttpServlet {
	private ImageCaptchaService imageCaptchaService;
	private String beanName = "imageCaptchaService";

	public void init(ServletConfig servletConfig) throws ServletException {
		super.init(servletConfig);
		WebApplicationContext wac = WebApplicationContextUtils
				.getRequiredWebApplicationContext(servletConfig
						.getServletContext());
		imageCaptchaService = (ImageCaptchaService) wac.getBean(beanName,
				ImageCaptchaService.class);
	}

	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 = imageCaptchaService
					.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();
	}
}

验证的单列类 CaptchaService.java
package com.spring;

import com.octo.captcha.engine.CaptchaEngine;
import com.octo.captcha.service.captchastore.CaptchaStore;
import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;

/***********************************************************************   
 *   
 *   CaptchaService.java     
 *   @copyright       Copyright:   2009-2012     
 *   @creator         周辉<br/>   
 *   @create-time   Jun 18, 2009   2:42:53 PM   
 *   @revision         $Id:     *   
 ***********************************************************************/
public class CaptchaService extends DefaultManageableImageCaptchaService {
	public CaptchaService() {
		super();
	}

	public CaptchaService(int minSeconds, int maxStoreSize, int loadBefore) {
		super(minSeconds, maxStoreSize, loadBefore);
	}

	public CaptchaService(CaptchaStore captchaStore,
			CaptchaEngine captchaEngine, int minSeconds, int maxStoreSize,
			int loadBefore) {
		super(captchaStore, captchaEngine, minSeconds, maxStoreSize, loadBefore);
	}

	public Boolean validateResponseForID(String ID, Object response) {
		Boolean isHuman;
		try {
			isHuman = super.validateResponseForID(ID, response);
		} catch (Exception e) {
			isHuman = false;
		}
		return isHuman;
	}
}

最后测试验证的类
ValidationServlet.java
package com.spring;

import java.io.IOException;

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

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

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

/***********************************************************************   
 *   
 *   ValidationServlet.java     
 *   @copyright       Copyright:   2009-2012     
 *   @creator         周辉<br/>   
 *   @create-time   Jun 18, 2009   3:16:50 PM   
 *   @revision         $Id:     *   
 ***********************************************************************/
public class ValidationServlet extends HttpServlet {
	private ImageCaptchaService imageCaptchaService;
	private String beanName = "imageCaptchaService";
	public void init(ServletConfig servletConfig) throws ServletException {   
        super.init(servletConfig);   
        WebApplicationContext wac = WebApplicationContextUtils
		.getRequiredWebApplicationContext(servletConfig
				.getServletContext());
        imageCaptchaService = (ImageCaptchaService) wac.getBean(beanName,
				ImageCaptchaService.class);
    }   
  
    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=imageCaptchaService.validateResponseForID(captchaId, response);
        } catch (CaptchaServiceException e) {   
            //should not happen, may be thrown if the id is not valid    
        }   
        System.out.println(isResponseCorrect); 
       // httpServletResponse.encodeUrl("sucess.html");
        if(isResponseCorrect.booleanValue()){
        	httpServletResponse.sendRedirect("success.html");
        }
        else {
        	 httpServletResponse.sendRedirect("failture.html");
        }
    }   
}

5 页面HTML
  login2.html
<html>  
  <head>  
    <title>MyHtml.html</title>  
       
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
    <meta http-equiv="description" content="this is my page">  
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">  
       
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->  
  
  </head>  
     
  <body>  
    <form name="f1" id="f1" action="/jcaptcha/validateAction" method="get">  
      <table border="0">  
        <tr>  
          <td>验证码:</td>  
          <td><img src="jcaptcha"><input type='text' name='j_captcha_response' value=''></td>  
        </tr>  
        <tr>  
          <td colspan="2" align="center"><input type="submit"></td>  
        </tr>  
      </table>  
         
    </form>  
  </body>  
</html>  

6 最后调用成功失败的页面success.html failture.html(略)
最后发布程序,启动TOMCAT 输入
http://localhost:8081/jcaptcha/login2.html
看到生成验证码了
分享到:
评论

相关推荐

    springsecurity3和JCaptcha的整合 验证码

    springsecurity3和JCaptcha的整合 验证码

    通过spring整合jcaptcha来处理验证码

    NULL 博文链接:https://shaw-n-lu.iteye.com/blog/1754796

    spring security 安全权限管理手册

    1、搭建基本的Spring Security项目 2、使用数据库管理用户权限 3、自定义认证数据库表结构 4、自定义登录页面 5、使用数据库管理资源 6、控制用户信息 MD5加密 获取当前用户信息 ...14、集成jcaptcha

    java验证码

    jcaptcha 验证码,spring MVC整合jcaptcha,java 验证码,缺点:不能存储于session;不能使用集群;成功生成验证码质量较低。

    jcaptcha:用 Java 编写的简单而强大的 CAPTCHA 库。 基于 patchca

    jcaptchaSimple yet powerful CAPTCHA library written in Java.patchca base on patchca : jcaptcha基于patchca做了扩展实现,并整合了spring mvc,生成五颜六色的验证码。/** * @author hunng */@Controllerpublic...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java开源包1

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包11

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包2

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包3

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包6

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包5

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包10

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包4

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包8

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包7

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包9

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包101

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    Java资源包01

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

Global site tag (gtag.js) - Google Analytics