到 Google 资讯主页   
EasyJF首页   资料   源码   软件    论坛   网站    
   使用帮助    
    该信息为本站MyRSS系统缓存内容,部分图片及附件有可能无法正常使用.easyjf.comBlogJava无关,不对该信息负责.通过http://kb.csdn.net/keyword/java//../../java/Articles/200606/2dd023bb-6c7a-4c38-b150-0cda9416fb93.html访问该信息的原始内容.
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   
用开源组件jcaptcha做jsp彩色验证码
作者:Alex 来源:BlogJava  发布时间:2006-06-11 00:00:00.0

key words: jsp验证码 jcaptcha

原文参考 这里

安装

Add jcaptcha-all.jar (provided in bin-distribution) and ehcache.jar (not provided see ehcache site) to your application class path, ie in you WEB-INF/lib folder.

实例一个jcaptcha服务,注意,必须是单例模式的

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

public?class?CaptchaServiceSingleton?{
????
????
private?static?ImageCaptchaService?instance?=?new?DefaultManageableImageCaptchaService();
????
????
public?static?ImageCaptchaService?getInstance(){
????????
return?instance;
????}
}

注:以上是默认的一个实现,下面是其他更多的实现
  • SimpleListSoundCaptchaEngine?? //还可以用声音,真爽哦
  • SpellerSoundCaptchaEngine
  • SpellerSoundCaptchaEngine
  • DefaultGimpyEngineCaptcha??? ??? ???
  • BaffleListGimpyEngineCaptcha??? ??? ???
  • BasicListGimpyEngineCaptcha??? ??? ???
  • DeformedBaffleListGimpyEngineCaptcha??? ??? ???
  • DoubleRandomListGimpyEngineCaptcha??? ??? ???
  • SimpleListImageCaptchaEngineCaptcha??? ??? ???
  • SimpleFishEyeEngineCaptcha
具体请参考官方说明

编写一个产生图片的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?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>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>


编写你的客户端的展示
<img?src="jcaptcha">
<input?type='text'?name='j_captcha_response'?value=''>

上面的src="jcaptcha"? 就是调用了上面的servlet,text里是用户填写的确认验证码

后台逻辑验证
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?
????????????}


OK,大功告成了.



Alex 2006-06-11 13:11

 
相关文章
 
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   


EasyJF.com 2006 隐私政策 使用EasyJF前必读