Using Captcha as a separate servlet is very un-Tapestry like. The way
to do it in Tapestry is to setup a Hivemind service. My app uses it
like this (hivemodule.xml):
<service-point id="CaptchaService"
interface="org.apache.tapestry.engine.IEngineService">
<invoke-factory>
<construct
class="org.opendating.tapestry.services.CaptchaService">
<set-object
property="linkFactory"
value="service:tapestry.url.LinkFactory"/>
</construct>
</invoke-factory>
</service-point>
<contribution configuration-id="tapestry.services.ApplicationServices">
<service name="captcha" object="service:CaptchaService"/>
</contribution>
You can then inject the service into the Captcha component you can
build. I posted links to the opensource app which uses this stuff.
Have a look at several interesting classes which do it 100% within
Tapestry, no external servlet.
Here are some: CaptchaService, OpenDatingCaptchaEngine, CaptchaComp,
RegistrationCaptchaPage.
The code is out there in the open. You could easily take pieces you
need and fit it right into your project.
Adam
On 17 Apr 2006 18:57:58 -0000, kelson tran
<[EMAIL PROTECTED]> wrote:
> I've been reading this tread, and I found it very useful. I'm still new
> to Tapestry. How do you use the servlet in your page? What is needed
> to set it up?
>
> Thx in advance
>
>
> On Sunday, April 16, 2006, at 7:50 PM, Konstantin Ignatyev wrote:
> >--0-1251190441-1145242250=:93503
> >Content-Type: text/plain; charset=iso-8859-1
> >Content-Transfer-Encoding: 8bit
> >
> >Just did the following and it seems to work beautifully
> >
> >
> >
> >public class JCaptchaServlet extends HttpServlet {
> >
> >
> > protected void doGet(HttpServletRequest request,
> >HttpServletResponse response) throws ServletException, IOException {
> >
> > String captchaID = request.getSession(true).getId();
> >
> > // call the ManageableImageCaptchaService methods
> > byte[] captchaChallengeAsJpeg = null;
> > ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
> > try {
> > ImageCaptchaService srv = App.getCaptchaService();
> > BufferedImage challenge =
> >srv.getImageChallengeForID(captchaID, request.getLocale());
> > Object challengeString = srv.getQuestionForID(captchaID,
> >request.getLocale());
> > // the output stream to render the captcha image as jpeg into
> >
> > // a jpeg encoder
> > JPEGImageEncoder jpegEncoder =
> >JPEGCodec.createJPEGEncoder(jpegOutputStream);
> > jpegEncoder.encode(challenge);
> > } catch (IllegalArgumentException e) {
> > // log a security warning and return a 404...
> >// if (log.isWarnEnabled())
> >// {
> >// log.warn(
> >// "There was a try from "
> >// + request.getRemoteAddr()
> >// + " to render an URL without ID"
> >// + " or with a too long one");
> >// theResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
> > return;
> >// }
> > } catch (CaptchaServiceException e) {
> > // log and return a 404 instead of an image...
> >// log.warn(
> >// "Error trying to generate a captcha and "
> >// + "render its challenge as JPEG",
> >// e);
> > response.sendError(HttpServletResponse.SC_NOT_FOUND);
> > return;
> > }
> >
> > captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
> >
> > // render the captcha challenge as a JPEG image in the response
> > response.setHeader("Cache-Control", "no-store");
> > response.setHeader("Pragma", "no-cache");
> > response.setDateHeader("Expires", 0);
> >
> > response.setContentType("image/jpeg");
> > ServletOutputStream responseOutputStream =
> > response.getOutputStream();
> > responseOutputStream.write(captchaChallengeAsJpeg);
> > }
> >
> >
> >}
> >
> >------------
> >private static ImageCaptchaService captchaService;
> > private static Object captchaGuard = new Object();
> >
> > public static ImageCaptchaService getCaptchaService() {
> > synchronized (captchaGuard) {
> > if (captchaService == null) {
> > captchaService = new EhcacheManageableImageCaptchaService(
> >new SimpleListImageCaptchaEngine() , 180, 100000){
> >
> > };
> > }
> > return captchaService;
> > }
> > }
> >
> >----------------------
> >
> >
> >
> >Validation
> >
> >@InjectObject( "service:tapestry.globals.HttpServletRequest")
> > public abstract HttpServletRequest getHttpRequest();
> >
> >............
> >if( App.getCaptchaService().validateResponseForID(
> >getHttpRequest().getSession(true).getId(), getCaptchaAnswer() )){
> > System.out.println("CAPTCHA - Pass");
> > }else{
> >
> >
> >
> >Oscar Picasso <[EMAIL PROTECTED]> wrote: Do you have a code
> >example of such an ImageCaptchaServlet?
> >
> >Daniel Lydiard wrote: I'm using Jcaptcha with my tapestry application.
> >
> >1. Load the ImageCaptchaServlet in your web.xml.
> >
> >
> >jcaptcha
> >
> >com.foo.ImageCaptchaServlet
> >
> >1
> >
> >
> >
> >
> >
> >
> >jcaptcha
> >
> >/jcaptcha
> >
> >
> >
> >
> >2. Do something like this in a component class method to get the captcha
> >question.
> >captchaId = getPage().getRequest().getSession(true).getId();
> >return CaptchaServiceSingleton.getInstance().getQuestionForID(captchaId);
> >
> >3. Point to the servlet for the captchaimage in your component .
> >
> >4. To validate the user response
> >captchaId = getRequest().getSession(true).getId();
> >
> >return
> >CaptchaServiceSingleton.getInstance().validateResponseForID(captchaId,
> >userResponse);
> >
> >
> >Hope this helps.
> >
> >
> >----- Original Message -----
> >From: "Oscar Picasso"
> >To: "Tapestry users"
> >Sent: Sunday, April 16, 2006 11:47 AM
> >Subject: Re: Looking for a CATCHPA
> >
> >
> >>I have taken a look. But I have no idea where to start. The api
> >>javadoc has
> >>only one class: JCaptchaCommentAuthenticator. It seems there is a
> >>problem
> >>with the site.
> >>
> >> Have you worked with JCaptcha? And do you know where to start?
> >>
> >> Oscar
> >>
> >>
> >>
> >> J�r�me BERNARD wrote: Have a loot at
> >> http://jcaptcha.sourceforge.net/
> >>
> >> Regards,
> >> J�r�me.
> >>
> >> On 4/16/06, Oscar Picasso wrote:
> >>> Hi,
> >>>
> >>> I'm looking for a CATCHPA library to use with my Tapestry application.
> >>> I'm looking for something easy to use and efficient.
> >>>
> >>> I welcome any advice.
> >>>
> >>> Oscar
> >>>
> >>>
> >>> ---------------------------------
> >>> Blab-away for as little as 1�/min. Make PC-to-Phone Calls
> >>>using Yahoo!
> >>> Messenger with Voice.
> >>>
> >>
> >>
> >> --
> >> J�r�me BERNARD,
> >> Kalixia, SARL.
> >> http://weblog.kalixia.com
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: [EMAIL PROTECTED]
> >> For additional commands, e-mail: [EMAIL PROTECTED]
> >>
> >>
> >>
> >>
> >> ---------------------------------
> >> Yahoo! Messenger with Voice. PC-to-Phone calls for ridiculously
> >>low rates.
> >
> >---------------------------------------------------------------------
> >To unsubscribe, e-mail: [EMAIL PROTECTED]
> >For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
> >
> >__________________________________________________
> >Do You Yahoo!?
> >Tired of spam? Yahoo! Mail has the best spam protection around
> >http://mail.yahoo.com
> >
> >
> >Konstantin Ignatyev
> >
> >
> >
> >
> >PS: If this is a typical day on planet earth, humans will add
> >fifteen million tons of carbon to the atmosphere, destroy 115 square
> >miles of tropical rainforest, create seventy-two miles of desert,
> >eliminate between forty to one hundred species, erode seventy-one
> >million tons of topsoil, add 2,700 tons of CFCs to the stratosphere,
> >and increase their population by 263,000
> >
> >Bowers, C.A. The Culture of Denial: Why the Environmental Movement
> >Needs a Strategy for Reforming Universities and Public Schools. New
> >York: State University of New York Press, 1997: (4) (5) (p.206)
> >--0-1251190441-1145242250=:93503--
>
>
>
>
> --
> Posted with http://DevLists.com. Sign up and save your mailbox.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>