[jboss-user] [JBoss Seam] - Re: Seam Captcha configuration

caye do-not-reply at jboss.com
Mon Sep 17 12:05:47 EDT 2007


Actually, i have been trying to customize the captcha with seam 2.0. And what i did is the same as wise_guybg, with some changes. My code is this:


  | import java.awt.Color;
  | import java.awt.image.BufferedImage;
  | import java.io.ByteArrayOutputStream;
  | import java.io.IOException;
  | 
  | import javax.imageio.ImageIO;
  | import javax.servlet.http.HttpServletRequest;
  | import javax.servlet.http.HttpServletResponse;
  | 
  | import org.jboss.seam.ScopeType;
  | import org.jboss.seam.annotations.Install;
  | import org.jboss.seam.annotations.Name;
  | import org.jboss.seam.annotations.Scope;
  | import org.jboss.seam.annotations.Startup;
  | import org.jboss.seam.annotations.intercept.BypassInterceptors;
  | import org.jboss.seam.captcha.CaptchaImage;
  | import org.jboss.seam.contexts.Contexts;
  | import org.jboss.seam.contexts.ServletLifecycle;
  | 
  | import com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator;
  | import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator;
  | import com.octo.captcha.component.image.textpaster.RandomTextPaster;
  | import com.octo.captcha.component.image.wordtoimage.ComposedWordToImage;
  | import com.octo.captcha.component.word.wordgenerator.RandomWordGenerator;
  | import com.octo.captcha.engine.image.gimpy.BasicGimpyEngine;
  | import com.octo.captcha.image.gimpy.GimpyFactory;
  | import com.octo.captcha.service.CaptchaServiceException;
  | import com.octo.captcha.service.captchastore.FastHashMapCaptchaStore;
  | import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
  | import com.octo.captcha.service.image.ImageCaptchaService;
  | 
  | @Startup
  | @Scope(ScopeType.APPLICATION)
  | @Name(value="org.jboss.seam.captcha.captchaImage")
  | @BypassInterceptors
  | @Install(precedence = Install.DEPLOYMENT,
  |          classDependencies="com.octo.captcha.service.image.ImageCaptchaService")
  | public class CustomCaptcha extends CaptchaImage
  | {
  |     private ImageCaptchaService service;
  |    
  |     public static CustomCaptcha instance() {
  |         if (!Contexts.isApplicationContextActive()) {
  |             throw new IllegalStateException("No application context active");
  |         }
  |         return (CustomCaptcha) Contexts.getApplicationContext().get(CustomCaptcha.class);
  |     }
  | 
  |     @Override
  |     public void create() {
  | 	System.out.println("generating captcha...");
  | 
  | 	BasicGimpyEngine customCaptcha = new BasicGimpyEngine();
  | 	GimpyFactory factory = new GimpyFactory(new RandomWordGenerator("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), new ComposedWordToImage(new RandomFontGenerator(new Integer(15), new Integer(15)), new UniColorBackgroundGenerator(new Integer(150), new Integer(30)), new RandomTextPaster(new Integer(4), new Integer(7), Color.BLACK)));
  | 	GimpyFactory[] factories = {factory};
  | 	customCaptcha.setFactories(factories);
  | 	
  | 	service = new DefaultManageableImageCaptchaService(
  |                 new FastHashMapCaptchaStore(),
  |                 customCaptcha,
  |                 180,
  |                 120000,
  |                 75000);
  |     }
  | 
  |     @Override
  |     public String getResourcePath() {
  |         return "/mycaptcha";
  |     }
  | 
  |     @Override
  |     public boolean validateResponse(String id, String response) {
  |         try {
  |             return service.validateResponseForID(id, response);
  |         }
  |         catch (CaptchaServiceException cse) {
  |             return false;
  |         }
  |     }
  | 
  |     @Override
  |     public void getResource(HttpServletRequest request, HttpServletResponse response) throws IOException
  |     {
  |         ByteArrayOutputStream out = new ByteArrayOutputStream();
  |         ServletLifecycle.beginRequest(request);
  |         
  |         try {           
  |             String captchaId = request.getQueryString();
  |             BufferedImage challenge = service.getImageChallengeForID(captchaId, request.getLocale());
  |             ImageIO.write(challenge, "jpeg", out);
  |         }
  |         catch (IllegalArgumentException e) {
  |             response.sendError(HttpServletResponse.SC_NOT_FOUND);
  |             return;
  |         }
  |         catch (CaptchaServiceException e) {
  |             response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
  |             return;
  |         }
  |         finally {
  |             ServletLifecycle.endRequest(request); 
  |         }
  | 
  |         response.setHeader("Cache-Control", "no-store");
  |         response.setHeader("Pragma", "no-cache");
  |         response.setDateHeader("Expires", 0);
  |         response.setContentType("image/jpeg");
  |         response.getOutputStream().write(out.toByteArray());
  |         response.getOutputStream().flush();
  |         response.getOutputStream().close();
  |     }
  |     
  | }

The only difference with the seam one is the precedence of installation and the kind of captcha generated (the default gimpy one was too dificult to read sometimes).

But i am having problems in the registration page where i'm using this captcha (i'm using on it JSF and A4J). The error is this one:

 
  | 18:52:42,007 WARN  [lifecycle] executePhase(PROCESS_VALIDATIONS 3,com.sun.faces.context.FacesContextImpl at 1903f07) threw exception
  | javax.faces.FacesException: /common/ui-elements/forms/captcha.xhtml @17,46 value="#{mycaptcha.response}": Target Unreachable, identifier 'mycaptcha' resolved to null
  | 	at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:108)
  | 	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
  | 	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
  | 	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
  | 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
  | 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
  | 	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:687)
  | 	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469)
  | 	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403)
  | 	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
  | 	at org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:195)
  | 	at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:159)
  | 	at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:141)
  | 	at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:90)
  | 	at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:395)
  | 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
  | 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
  | 	at org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:127)
  | 	at org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter.doFilter(BaseFilter.java:277)
  | 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
  | 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
  | 	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
  | 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
  | 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
  | 	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
  | 	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
  | 	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
  | 	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
  | 	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
  | 	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
  | 	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
  | 	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
  | 	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
  | 	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241)
  | 	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
  | 	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:580)
  | 	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
  | 	at java.lang.Thread.run(Thread.java:595)
  | Caused by: javax.el.PropertyNotFoundException: /common/ui-elements/forms/captcha.xhtml @17,46 value="#{mycaptcha.response}": Target Unreachable, identifier 'mycaptcha' resolved to null
  | 	at com.sun.facelets.el.TagValueExpression.getType(TagValueExpression.java:62)
  | 	at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:81)
  | 	at javax.faces.component.UIInput.getConvertedValue(UIInput.java:934)
  | 	at javax.faces.component.UIInput.validate(UIInput.java:860)
  | 	at javax.faces.component.UIInput.executeValidate(UIInput.java:1065)
  | 	at javax.faces.component.UIInput.processValidators(UIInput.java:666)
  | 	at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1033)
  | 	at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1033)
  | 	at javax.faces.component.UIForm.processValidators(UIForm.java:229)
  | 	at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1033)
  | 	at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:662)
  | 	at org.ajax4jsf.framework.ajax.AjaxViewRoot.access$201(AjaxViewRoot.java:53)
  | 	at org.ajax4jsf.framework.ajax.AjaxViewRoot$3.invokeRoot(AjaxViewRoot.java:315)
  | 	at org.ajax4jsf.framework.ajax.JsfOneOneInvoker.invokeOnRegionOrRoot(JsfOneOneInvoker.java:53)
  | 	at org.ajax4jsf.framework.ajax.AjaxContext.invokeOnRegionOrRoot(AjaxContext.java:191)
  | 	at org.ajax4jsf.framework.ajax.AjaxViewRoot.processValidators(AjaxViewRoot.java:329)
  | 	at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:100)
  | 	... 37 more
  | 

I would like to know if there is some way that the captcha wouldnt fail with a4jsf at the same time, or if some of you could guess where i am making the mistake.

Thanks in advance!

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4085127#4085127

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4085127



More information about the jboss-user mailing list