2009-04-26 3 views
1

Ich versuche http://code.google.com/p/kaptcha/ zu verwenden, die wie eine sehr einfache Möglichkeit aussieht, CAPTCHA einzuschließen. Meine Demo-App ist JSF und obwohl the instructions are simple für JSP, weiß ich nicht, wie man sie in JSF verwendet. Wie übersetze ich das in JSF?Verwendung von Kaptcha mit JSF

In Ihrem Code, der die Aktion einreichen verwaltet:

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

Ich versuchte, es in meinem setzen:

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

aber es funktioniert nicht verstehe das Anfrageobjekt :(

Antwort

0

Sie können das Request-Objekt aus dem JSF externen Kontext abgerufen werden, die von der Faces zugänglich ist, mit dem folgenden Code:

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



bearbeiten (dank McDowell):

Eine andere Möglichkeit ist die Verwendung der FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap() Methode t o die Anfrageparameter zugreifen ...

+1

Eine Alternative ist ExternalContext.getRequestParameterMap() zu verwenden, das Importieren der Servlet-API zu vermeiden. – McDowell

1

Diese äquivalente JSF Aktion sollte es tun:

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

Dies setzt voraus, dass Sie h:inputText und h:graphicImage in Ihrer JSF-Ansicht verwenden möchten anstelle von HTML-Elementen.

1

Die Implementierung des Validators ist eine weitere einfache Möglichkeit, den Kaptcha zu validieren.

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