Hi,

I'm trying to create a form with captcha for a demo I was building, but am having problems with the update when the password is incorrect. What I wanted to achieve was the captcha being regenerated with a new word on each try. On submit I can see the captcha being regenerated, but it does not update (the feedback form is.), if I do a 'view image' in
firefox I see the updated image.

I think this is because the image is being cached by firefox, but am not certain.

I'm probably missing something stupid, but for the life of me can't work it out. Any help greatly appreciated.

Thanks

Rory

---------------------------------------------------------------

package org.sourceforge.jemm.jemmblog.pages.blog;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.util.value.ValueMap;
import org.sourceforge.jemm.jemmblog.domain.Blog;
import org.sourceforge.jemm.jemmblog.domain.DuplicateUserException;
import org.sourceforge.jemm.jemmblog.domain.dto.BlogDTO;
import org.sourceforge.jemm.jemmblog.pages.BasePage;
import org.sourceforge.jemm.jemmblog.util.CaptchaHelper;

/**
* Form for creating blog with captcha.
*
* n.b. captchaHelper.refreshCaptcha() creates a new CaptchaImageResource with a different
* password on each invocation.
*/
public class CreateBlogPage extends BasePage {

   private final FeedbackPanel feedbackPanel;
   private final ValueMap properties = new ValueMap();

   private final CaptchaHelper captchaHelper = new CaptchaHelper();
   private final Image captchaImage;
public CreateBlogPage() {
       ;
       Form<BlogDTO> form = new Form<BlogDTO>("form");
       form.setModel(new CompoundPropertyModel<BlogDTO>(new BlogDTO()));

       form.add(new TextArea<String>("blogName").setRequired(true));
       form.add(new TextArea<String>("username").setRequired(true));
       form.add(new TextArea<String>("password").setRequired(true));

//***************************************************************************************** // create teh captcha components captchaImage = new Image("captchaImage", captchaHelper.refreshCaptcha()); captchaImage.setOutputMarkupId(true);
       form.add(captchaImage);
form.add(new RequiredTextField<String>("captchaField", new PropertyModel<String>(properties, "captchaField")) {
           private static final long serialVersionUID = 1L;

           @Override
           protected void onComponentTag(final ComponentTag tag) {
               super.onComponentTag(tag);
// **************************************************************************************
               //  this does not work either...

               // clear the field after each render
               tag.put("value", "");
           }
       });



       add(form);

       AjaxButton ajaxBtn = new AjaxButton("ajaxButton") {
           private static final long serialVersionUID = 1L;

           @Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
               super.onSubmit();
               if (!captchaHelper.captchaMatches(getPassword())) {
error("Captcha value incorrect."); } else {
                   BlogDTO blogDTO = (BlogDTO) form.getModelObject();
                   try {
                       Blog blog = getManager().createBlog(blogDTO);
                       setResponsePage(new BlogOverviewPage(blog));
                   }catch(DuplicateUserException due) {
error("Blog user " + blogDTO.getUsername() + " already exists");
                   }
               }

//***************************************************************************************
               //  update the captcha image, add it to the ajax response
captchaImage.setImageResource(captchaHelper.refreshCaptcha());
               target.addComponent(captchaImage,"captchaImage");
           }

           @Override
           protected void onError(AjaxRequestTarget target, Form<?> form) {
               target.addComponent(feedbackPanel);
           }
       };
       form.add(ajaxBtn);
feedbackPanel = new FeedbackPanel("feedback");
       // need to set output markupid to true
       feedbackPanel.setOutputMarkupId(true);
       add(feedbackPanel);
   }

   private String getPassword() {
       return properties.getString("captchaField");
   }

   /** Utility method used for testing */
   public String getCaptchaChallenge() {
       return captchaHelper.getCPassword();
   }
}
---------------------------------------------------------------------------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
   <head>
       <title>Create Blog</title>

   </head>

   <body>
       <wicket:extend>
           <div wicket:id="feedback">
           </div>

           <form wicket:id="form">
               <p>
                   Blog Name:
                   <br />
                   <input type="text" wicket:id="blogName" />
               </p>
               <p>
                   Username:
                   <br />
                   <input type="text" wicket:id="username" />
               </p>
               <p>
                   Password:
                   <br />
                   <input type="text" wicket:id="password" />
               </p>
                <p><img wicket:id="captchaImage" /></p>
               <p> Please replicate the text you see above
               <br/>
<input wicket:id="captchaField" id="captchaField" type="text" size="40" />
               <p>
<input type="submit" wicket:id="ajaxButton" value="Create blog" />
               </p>
</form>
       </wicket:extend>
   </body>
</html>


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to