Пример интеграции Wicket + Kaptcha
Kaptcha - это простая и легкая в использовании библиотека Java для проверки изображения captcha. В этом уроке мы покажем вам, какintegrate Kaptcha with Wicket framework, via Spring.
Использованные библиотеки:
-
Капча v2.3.2
-
Калитка v1.4.17
-
калитка-пружина v1.4.17
-
Spring v3.0.5.RELEASE
Note
Эта статья в основном описывает, как интегрировать Kaptcha с фреймворком Wicket, для Wicket + Spring, пожалуйста, обратитесь к этому «Wicket + Spring
integration example».
1. Получить капчу
Согласно этомуthread, владелец не любит Maven, поэтому вам придется вручную установить библиотеку в локальный репозиторий Maven.
1. Загрузите библиотеку Kaptcha здесьhttp://code.google.com/p/kaptcha/
2. Задайте ниже команду Maven, чтобы установить его вручную.
mvn install:install-file -Dfile=c:\kaptcha-2.3.2.jar -DgroupId=com.google.code
-DartifactId=kaptcha -Dversion=2.3.2 -Dpackaging=jar
3. Позже вы можете включить капчу в свой файл pom.xml.
Файл: pom.xml
com.google.code kaptcha 2.3.2
2. DefaultKaptcha через Spring
Создайте bean-компонент Spring для «DefaultKaptcha» с именемcaptchaProducer.
Файл: applicationContext.xml
3. CaptchaImage
Создайте класс CaptchaImage, который расширяетNonCachingImage Wicket и использует классDynamicImageResource для динамического создания изображения captcha.
Файл: CaptchaImage.java
package com.example.user;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import javax.servlet.http.HttpServletRequest;
import org.apache.wicket.Request;
import org.apache.wicket.RequestCycle;
import org.apache.wicket.markup.html.image.NonCachingImage;
import org.apache.wicket.markup.html.image.resource.DynamicImageResource;
import org.apache.wicket.protocol.http.WebRequest;
import org.apache.wicket.spring.injection.annot.SpringBean;
import com.google.code.kaptcha.Constants;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class CaptchaImage extends NonCachingImage {
private static final String CAPTCHA_PRODUCER = "captchaProducer";
// inject via Spring
@SpringBean
private DefaultKaptcha captchaProducer;
// private DefaultKaptcha captchaProducer;
public CaptchaImage(String id) {
super(id);
setImageResource(new DynamicImageResource() {
public byte[] getImageData() {
ByteArrayOutputStream os = new ByteArrayOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);
try {
BufferedImage bi = getImageCaptchaService();
encoder.encode(bi);
return os.toByteArray();
} catch (Exception e) {
throw new RuntimeException(e);
}
};
private BufferedImage getImageCaptchaService() {
Request request = RequestCycle.get().getRequest();
HttpServletRequest httpRequest = ((WebRequest) request)
.getHttpServletRequest();
String capText = captchaProducer.createText();
// store the text in the session
httpRequest.getSession().setAttribute(
Constants.KAPTCHA_SESSION_KEY, capText);
// create the image with the text
BufferedImage bi = captchaProducer.createImage(capText);
return bi;
}
});
}
}
4. CaptchaValidator
Создайте настраиваемый валидатор с именем «CaptchaValidator», который будет использоваться для проверки пользовательского ввода и сравнения с кодом, сгенерированным Kaptcha.
Файл: CaptchaValidator.java
package com.example.user; import javax.servlet.http.HttpServletRequest; import org.apache.wicket.Request; import org.apache.wicket.RequestCycle; import org.apache.wicket.protocol.http.WebRequest; import org.apache.wicket.validation.IValidatable; import org.apache.wicket.validation.validator.AbstractValidator; public class CaptchaValidator extends AbstractValidator{ private static final long serialVersionUID = 1L; private String INVALID_CODE = "captcha.invalid"; public void onValidate(IValidatable validatable) { String kaptchaReceived = (String) validatable.getValue(); Request request = RequestCycle.get().getRequest(); HttpServletRequest httpRequest = ((WebRequest) request) .getHttpServletRequest(); String kaptchaExpected = (String) httpRequest.getSession() .getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY); if (kaptchaReceived == null || !kaptchaReceived.equalsIgnoreCase(kaptchaExpected)) { error(validatable); } } // validate on numm value as well @Override public boolean validateOnNullValue() { return true; } @Override protected String resourceKey() { return INVALID_CODE; } }
Файл: package.properties
captcha.invalid = Incorrect answer, type words in image again!
5. Компоненты калитки
Интегрируйте Kaptcha с компонентами Wicket.
package com.example.user;
import org.apache.wicket.PageParameters;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.model.PropertyModel;
public class KaptchaPage extends WebPage {
private String captchaInput;
public KaptchaPage(final PageParameters parameters) {
final CaptchaImage captchaImage = new CaptchaImage("kaptchaImage");
captchaImage.setOutputMarkupId(true);
TextField captchaTF = new TextField("captcha",
new PropertyModel(this, "captchaInput"));
captchaTF.add(new CaptchaValidator());
Form> form = new Form("form") {
@Override
protected void onSubmit() {
info("Image words are correct!!!");
};
};
form.add(new AjaxFallbackLink("link") {
@Override
public void onClick(final AjaxRequestTarget target) {
captchaImage.detach();
if (target != null) {
target.addComponent(captchaImage);
} else {
// javascript is disable
}
}
}.add(captchaImage));
form.add(captchaTF);
add(form);
add(new FeedbackPanel("feedback"));
}
}
NotecaptchaImage.detach(); - позволяет динамически генерировать новое изображение капчи, когда пользователь нажимает на изображение капчи.
Wicket + Kaptcha integration example
6. Demo
Начало и посещение -http://localhost:8080/WicketExamples/
Если импут неверен:

Если ввод правильный:

Скачать -Wicket-Kaptcha-Integration-Example.zip (10 КБ)