Wicket + Kaptcha Integrationsbeispiel

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:

  1. Kaptcha v2.3.2

  2. Wicket v1.4.17

  3. Wicket-Spring v1.4.17

  4. 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);

        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"));
    }

}

Note
captchaImage.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

Wenn die Eingabe falsch ist:

wicket kaptcha

Wenn die Eingabe korrekt ist:

wicket kaptcha

Laden Sie es herunter -Wicket-Kaptcha-Integration-Example.zip (10 KB)