2009-04-26 6 views
1

J'essaie d'utiliser http://code.google.com/p/kaptcha/ qui ressemble à un moyen très simple d'inclure CAPTCHA. Mon application de démonstration est JSF et bien que the instructions are simple pour JSP, je ne sais pas comment les utiliser dans JSF. Comment est-ce que je traduis cela dans JSF?Utilisation de kaptcha avec JSF

Dans votre code qui gère l'action soumettre:

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

J'essayé de mettre dans mon:

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

mais il ne comprendre l'objet de requête :(

Répondre

0

Vous pouvez récupérer l'objet de la demande du JSF Contexte externe, qui est accessible à partir du FacesContext, en utilisant le code suivant:

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



Modifier (grâce à McDowell):

Une autre méthode consiste à utiliser la méthode FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap() t o accéder aux paramètres de la requête ...

+1

Une alternative est d'utiliser ExternalContext.getRequestParameterMap() pour éviter d'importer l'API Servlet. – McDowell

1

Cette action équivalent JSF devrait le faire:

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

Cela suppose que vous souhaitez utiliser h:inputText et h:graphicImage dans votre vue JSF au lieu d'éléments HTML.

1

La mise en œuvre du validateur est un autre moyen facile de valider le kaptcha.

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