Могу ли я использовать RE-Captcha с Wicket? - PullRequest
1 голос
/ 28 марта 2012

Могу ли я использовать recaptcha с apache wicket 1.5.3? Есть хороший пример?

Ответы [ 3 ]

1 голос
/ 16 августа 2017

С точки зрения Google reCAPTCHA v2 , вы можете просто следовать его инструкциям, что просто.

Прежде всего, перейдите на Google reCAPTCHA и зарегистрируйте там свою заявку. Тогда вы можете работать на стороне клиента и сервера соответственно, как показано ниже:

На стороне клиента ( см. Ссылку )

Сначала вставьте фрагмент ниже <script...></script> перед закрывающим тегом в шаблоне HTML, например:

    <script src='https://www.google.com/recaptcha/api.js'></script>
</head>

Затем вставьте фрагмент ниже <div...></div> в конец места, где вы хотите, чтобы появился виджет reCAPTCHA, например:

    <div class="g-recaptcha" data-sitekey="{your public site key given by Google reCAPTCHA}"></div>
</form>

Это все на стороне клиента.

На стороне сервера ( см. Ref )

Когда пользователь отправляет форму, вам необходимо получить маркер ответа пользователя из параметра g-recaptcha-response POST. Затем используйте токен вместе с секретным ключом, предоставленным Google reCAPTCHA, и необязательно с IP-адресом пользователя, а затем отправьте запрос в Google reCAPTCHA API. Затем вы получите ответ от Google reCAPTHA, в котором будет указано, успешно ли прошла проверка формы.

Ниже приведен пример кода на стороне сервера.

  • Пользователь отправляет форму Wicket (в этом примере Wicket 6):
protected void onSubmit() {
    HttpServletRequest httpServletRequest = (HttpServletRequest)getRequest().getContainerRequest();
    boolean isValidRecaptcha = ReCaptchaV2.getInstance().verify(httpServletRequest);
    if(!isValidRecaptcha){
        verificationFailedFeedbackPanel.setVisible(true);
        return;
    }

    // reCAPTCHA verification succeeded, carry on handling form submission
    ...
}

ReCaptchaV2.java (Просто Java, независимый от веб-фреймворка)

import javax.servlet.http.HttpServletRequest;    
import org.apache.log4j.Logger;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;


public class ReCaptchaV2 {

    private final static Logger logger = Logger.getLogger(ReCaptchaV2.class);

    private final static String VERIFICATION_URL = "https://www.google.com/recaptcha/api/siteverify";
    private final static String SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

    private static ReCaptchaV2 instance = new ReCaptchaV2();

    private ReCaptchaV2() {}

    public static ReCaptchaV2 getInstance() {
        return instance;
    }

    private boolean verify(String recaptchaUserResponse, String remoteip) {
        boolean ret = false;
        if (recaptchaUserResponse == null) {
            return ret;
        }

        RestTemplate rt = new RestTemplate();

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

        MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();
        map.add("secret", SECRET);
        map.add("response", recaptchaUserResponse);
        if (remoteip != null) {
            map.add("remoteip", remoteip);
        }
        HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<MultiValueMap<String, String>>(map, headers);

        ResponseEntity<String> res = null;
        try {
            res = rt.exchange(VERIFICATION_URL, HttpMethod.POST, httpEntity, String.class);
        } catch (Exception e) {
            logger.error("Exception: " + e.getMessage());
        }

        if (res == null || res.getBody() == null) {
            return ret;
        }

        Response response = null;
        try {
            response = new ObjectMapper().readValue(res.getBody(), Response.class);
        } catch (Exception e) {
            logger.error("Exception: " + e.getMessage());
        }

        if (response != null && response.isSuccess()) {
            ret = true;
        }

        logger.info("Verification result: " + ret);
        return ret;
    }

    public boolean verify(HttpServletRequest httpServletRequest) {
        boolean ret = false;
        if (httpServletRequest == null) {
            return ret;
        }

        String recaptchaUserResponse = httpServletRequest.getParameter("g-recaptcha-response");
        String remoteAddr = httpServletRequest.getRemoteAddr();
        return verify(recaptchaUserResponse, remoteAddr);
    }
}

Response.java (Java POJO)

public class Response {
    private String challenge_ts;
    private String hostname;
    private boolean success;

    public Response() {}

    public String getChallenge_ts() {
        return challenge_ts;
    }

    public void setChallenge_ts(String challenge_ts) {
        this.challenge_ts = challenge_ts;
    }

    public String getHostname() {
        return hostname;
    }

    public void setHostname(String hostname) {
        this.hostname = hostname;
    }

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    @Override
    public String toString() {
        return "ClassPojo [challenge_ts = " + challenge_ts + ", hostname = " + hostname + ", success = " + success + "]";
    }
}
0 голосов
/ 04 апреля 2012

Возможно, компоненты калитки xaloon могут быть решением для вас.У них есть плагин Recaptcha.

0 голосов
/ 28 марта 2012

Вы прочитали это ?

Я добавил руководство здесь на случай, если страница исчезнет.

Использование

Мы создадим панель с именем RecaptchaPanel.Чтобы использовать этот компонент в своем приложении, все, что вам нужно сделать, это:

add(new RecaptchaPanel("recaptcha"));

и, конечно, добавьте компонент в вашу разметку:

<div wicket:id="recaptcha"></div>

Реализация

Реализация проста.Все, что вам нужно сделать, это выполнить несколько шагов:

Добавить зависимость recaptcha в ваш проект

<dependency>
 <groupid>net.tanesha.recaptcha4j</groupid>
 <artifactid>recaptcha4j</artifactid>
 <version>0.0.7</version>
</dependency>

Эта библиотека скрывает детали реализации и предоставляет API для работы со службой recaptcha.

Создать связанную разметку (RecaptchaPanel.html)

<wicket:panel><div wicket:id="captcha"></div></wicket:panel>

Создать RecaptchaPanel.java

import net.tanesha.recaptcha.ReCaptcha;
import net.tanesha.recaptcha.ReCaptchaFactory;
import net.tanesha.recaptcha.ReCaptchaImpl;
import net.tanesha.recaptcha.ReCaptchaResponse;

/**
 * Displays recaptcha widget. It is configured using a pair of public/private keys which can be registered at the
 * following location:
 * 
* https://www.google.com/recaptcha/admin/create
 * <br>
 * More details about recaptcha API: http://code.google.com/apis/recaptcha/intro.html
 *
 * @author Alex Objelean
 */
@SuppressWarnings("serial")
public class RecaptchaPanel extends Panel {
  private static final Logger LOG = LoggerFactory.getLogger(RecaptchaPanel.class);
  @SpringBean
  private ServiceProvider serviceProvider;


  public RecaptchaPanel(final String id) {
    super(id);
    final ReCaptcha recaptcha = ReCaptchaFactory.newReCaptcha(serviceProvider.getSettings().getRecaptchaPublicKey(),
      serviceProvider.getSettings().getRecaptchaPrivateKey(), false);
    add(new FormComponent<void>("captcha") {
      @Override
      protected void onComponentTagBody(final MarkupStream markupStream, final ComponentTag openTag) {
        replaceComponentTagBody(markupStream, openTag, recaptcha.createRecaptchaHtml(null, null));
      }

      @Override
      public void validate() {
        final WebRequest request = (WebRequest)RequestCycle.get().getRequest();

        final String remoteAddr = request.getHttpServletRequest().getRemoteAddr();
        final ReCaptchaImpl reCaptcha = new ReCaptchaImpl();
        reCaptcha.setPrivateKey(serviceProvider.getSettings().getRecaptchaPrivateKey());

        final String challenge = request.getParameter("recaptcha_challenge_field");
        final String uresponse = request.getParameter("recaptcha_response_field");
        final ReCaptchaResponse reCaptchaResponse = reCaptcha.checkAnswer(remoteAddr, challenge, uresponse);

        if (!reCaptchaResponse.isValid()) {
          LOG.debug("wrong captcha");
          error("Invalid captcha!");
        }
      }
    });
  }
}
</void>

На что следует обратить внимание:

  • ServiceProvider - это пружинный компонент, содержащий конфигурации reCaptcha (открытый ключ и закрытый ключ).Эти ключи различаются в зависимости от домена, в котором развернуто ваше приложение (по умолчанию работает для любого ключа при использовании домена localhost).Вы можете сгенерировать ключи здесь: https://www.google.com/recaptcha/admin/create
  • RecaptchaPanel содержит FormComponent, который позволяет реализовать метод validate, содержащий логику проверки.
  • Поскольку reCaptcha использует жестко закодированные значения для скрытых полей, этот компонент не может иметь несколько независимых экземпляров на одной странице.
...