Использование капчи с JSF - PullRequest
1 голос
/ 27 апреля 2009

Я пытаюсь использовать http://code.google.com/p/kaptcha/, который выглядит как очень простой способ включить CAPTCHA. Мое демонстрационное приложение - JSF, и хотя инструкции для JSP просты , я не знаю, как их использовать в JSF. Как мне перевести это в JSF?

В вашем коде, управляющем действием отправки:

String kaptchaExpected = (String)request.getSession() .getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY); String kaptchaReceived = request.getParameter("kaptcha");

if (kaptchaReceived == null || !kaptchaReceived.equalsIgnoreCase(kaptchaExpected)) { setError("kaptcha", "Invalid validation code."); }

Я пытался вставить это в мой:

public String button1_action() {
    // TODO: Process the action. 
    return "success";
}

но он не понимает объект запроса: (

Ответы [ 3 ]

1 голос
/ 27 апреля 2009

Это эквивалентное действие JSF должно сделать это:

  // bind to <h:inputText value="#{thisbean.kaptchaReceived}" />
  private String kaptchaReceived;

  public String getKaptchaReceived() {
    return kaptchaReceived;
  }

  public void setKaptchaReceived(String kaptcha) {
    kaptchaReceived = kaptcha;
  }

  public String button1_action() {
    if (kaptchaReceived != null) {
      FacesContext context = FacesContext
          .getCurrentInstance();
      ExternalContext ext = context.getExternalContext();
      Map<String, Object> session = ext.getSessionMap();
      String kaptchaExpected = session
          .get(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
      if (kaptchaReceived.equalsIgnoreCase(kaptchaExpected)) {
        return "success";
      }
    }
    return "problem";
  }

Предполагается, что вы хотите использовать h: inputText и h: graphicImage в представлении JSF вместо элементов HTML.

1 голос
/ 12 января 2011

Реализация валидатора - это еще один простой способ проверки капчи.

<h:inputText id="kaptcha" autocomplete="off" required="true">
     <f:validator validatorId="kaptchaValidator" />
</h:inputText>
<h:message for="kaptcha" styleClass="errorMessage"/>

--- Validator ---

public class KaptchaValidator implements Validator {

@Override
public void validate(FacesContext facesContext, UIComponent uiComponent, Object value) throws ValidatorException {

HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);

        String kaptchaExpected = (String) session.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);

        String kaptchaReceived = (String) value;

        if (kaptchaReceived == null || !kaptchaReceived.equalsIgnoreCase(kaptchaExpected)) {
            FacesMessage message = new FacesMessage();

            message.setDetail("Invalid Security Code.");
            message.setSummary("Invalid security code.");
            message.setSeverity(FacesMessage.SEVERITY_INFO);

            throw new ValidatorException(message);
        }
    }

0 голосов
/ 27 апреля 2009

Вы можете получить объект запроса из внешнего контекста JSF, который доступен из FacesContext, используя следующий код:

HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();


<Ч />

Редактировать (спасибо Макдауэлл ):

Другой способ - использовать метод FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap() для доступа к параметрам запроса ...

...