You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by RG <ro...@playonthego.com> on 2009/10/02 12:51:06 UTC
Problems with refreshing captcha.
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: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org
Re: Problems with refreshing captcha.
Posted by RG <ro...@playonthego.com>.
Hi Sjoerd,
Thanks for the response.
I;m using the wicket-extensions CaptchaImageResource, I can't override
this, and assume it would set the cache headers itself.
My guess is the the resource reference inthe generated html doesn't
change and that the page does not feel a need to reload it,
(I could be barking up completely the wrong tree mind ;)
Cheers
Rory
Sjoerd Schunselaar wrote:
> I had the same problem with generating statistics.
>
> If your're extending the wicket Image class, you should override
> getImageResource.
> Simply add this method in getImageResource:
>
> @Override
> protected void setHeaders(WebResponse response) {
> if (isCacheable()) {
> super.setHeaders(response);
> } else {
> response.setHeader("Pragma", "no-cache");
> response.setHeader("Cache-Control", "no-cache");
> response.setDateHeader("Expires", 0);
> }
> }
>
> And you're done.
>
>
> Good luck.
>
>
> On Fri, Oct 2, 2009 at 12:51 PM, RG <ro...@playonthego.com> wrote:
>
>> 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: users-unsubscribe@wicket.apache.org
>> For additional commands, e-mail: users-help@wicket.apache.org
>>
>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>
>
Re: Problems with refreshing captcha.
Posted by Sjoerd Schunselaar <s....@gmail.com>.
I had the same problem with generating statistics.
If your're extending the wicket Image class, you should override
getImageResource.
Simply add this method in getImageResource:
@Override
protected void setHeaders(WebResponse response) {
if (isCacheable()) {
super.setHeaders(response);
} else {
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
}
}
And you're done.
Good luck.
On Fri, Oct 2, 2009 at 12:51 PM, RG <ro...@playonthego.com> wrote:
> 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: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org