Integrationsbeispiel für Wicket + Kaptcha
Kaptcha ist eine einfache und benutzerfreundliche Java-Bibliothek, mit der eine Captcha-Bildvalidierung erstellt werden kann. In diesem Tutorial zeigen wir Ihnen, wie manintegrate Kaptcha with Wicket framework, via Spring macht.
Verwendete Bibliotheken:
-
Kaptcha v2.3.2
-
Wicket v1.4.17
-
Wicket-Spring v1.4.17
-
Spring v3.0.5.RELEASE
Note
In diesem Artikel wird hauptsächlich beschrieben, wie Kaptcha in das Wicket-Framework integriert wird. Für Wicket + Spring wird auf dieses „Wicket + Spring
integration example“ verwiesen.
1. Holen Sie sich Kaptcha
Gemäß diesenthread mag der Eigentümer Maven nicht, daher müssen Sie die Bibliothek manuell in Ihrem lokalen Maven-Repository installieren.
1. Holen Sie sich die Kaptcha-Bibliothek hierhttp://code.google.com/p/kaptcha/
2. Problem unter dem Maven-Befehl, um es manuell zu installieren.
mvn install:install-file -Dfile=c:\kaptcha-2.3.2.jar -DgroupId=com.google.code -DartifactId=kaptcha -Dversion=2.3.2 -Dpackaging=jar
3. Später können Sie kaptcha in Ihre pom.xml-Datei aufnehmen.
Datei: pom.xml
com.google.code kaptcha 2.3.2
2. DefaultKaptcha über Spring
Erstellen Sie eine Spring Bean für „DefaultKaptcha“ mit dem NamencaptchaProducer.
Datei: applicationContext.xml
3. CAPTCHA Bild
Erstellen Sie eine CaptchaImage-Klasse, die dieNonCachingImage
von Wicket erweitert und mithilfe derDynamicImageResource
-Klasse dynamisch ein Captcha-Bild generiert.
Datei: 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
Erstellen Sie einen benutzerdefinierten Validator mit dem Namen „CaptchaValidator“, um Benutzereingaben zu validieren und mit dem von Kaptcha generierten Code zu vergleichen.
Datei: 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; } }
Datei: package.properties
captcha.invalid = Incorrect answer, type words in image again!
5. Wicket-Komponenten
Integrieren Sie Kaptcha in Wicket-Komponenten.
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); TextFieldcaptchaTF = 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();
ermöglicht die dynamische Generierung eines neuen Captcha-Bildes, während der Benutzer auf das Captcha-Bild klickt.
Wicket + Kaptcha integration example
6. Demo
Start und Besuch -http://localhost:8080/WicketExamples/
Wenn die Eingabe falsch ist:
Wenn die Eingabe korrekt ist:
Laden Sie es herunter -Wicket-Kaptcha-Integration-Example.zip (10 KB)