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
看到生成验证码了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值