ADF 11G wachtwoord veld werkt niet correct met PPR
Bij ADF 11G is het mogelijk een wachtwoord veld te creëren middels het setten van het secret attribuut.
<af:inputText label="Wachtwoord” id="password" clientComponent="true" required="true" secret="true" requiredMessageDetail="Wachtwoord verplicht" value="#{myBean.wachtwoord}">
Nu willen we natuurlijk kunnen valideren of dit wachtwoord bijvoorbeeld tussen de 8 en 12 lang is.. In ADF 11G is het mogelijk hiervoor een clientside validator toe toevoegen aan de inputText middels het volgende:
<af:inputText …..>
<af:validateLength minimum="8" maximum="12" hintMinimum="mininmaal 8" hintMaximum="maximaal 12" messageDetailNotInRange="niet tussen 8 en 12">
</af:inputText …..>
Als men nu een wachtwoord invult en uit het veld tabt wordt het password gevalideerd en indien niet correct wordt een melding getoond.
So far so good… Maar nu komt het..
Indien er elders op de pagina een PPR (partial page rendering) af gaat wordt de waarde van het wachtwoord veld gezet naar ******. Letterlijk 6 sterretjes dus.. (ook aan de server kant)
Als je nu opslaat gaat de validatie niet nogmaals af (aan de clientside) en gaat het fout aan de server kant omdat je wachtwoord nu ineens gewoon 6 kan zijn en iedereen het zelfde wachtwoord heeft…
De oplossing voor dit probleem is als volgt.
Meteen na het tabben het veld submitten (naar de server posten) middels autoSubmit en het toevoegen van een eigen geschreven validator voor de serverkant. De tag komt er dan als volgt uit te zien:
<af:inputText label="Wachtwoord” id="password" autoSubmit="true" clientComponent="true" required="true" requiredMessageDetail="Wachtwoord verplicht" value="#{myBean.wachtwoord}"/>
<myTag:validatePassword message="Wachtwoord ongeldig"/>
In de validator staat dan de logica die normaal gedaan zou worden door bijvoorbeeld af:validateLength van adf.
public class PasswordValidator implements Validator, /* ClientValidator, */ StateHolder {
private ValueExpression message;
/**
* Zet de foutmelding die getoond moet worden als het veld niet valide is.
* @param message foutmelding
*/
public void setMessage(final ValueExpression message) {
this.message = message;
}
/**
* Foutmelding die getoond moet worden als het veld niet valide is.
* @return foutmelding
*/
public String getMessage() {
String result = null;
if(message != null) {
if(message.isLiteralText()) {
result = message.getExpressionString();
} else {
ELContext elContext = FacesContext.getCurrentInstance().getELContext();
result = (String)message.getValue(elContext);
}
}
return result; }
/* ******************** VALIDATOR ******************** */
/**
* Voer de validatie uit.
*
* @param facesContext faces context
* @param component component wat gevalideerd moet worden
* @param value waarde die gevalideerd moet worden
*/
@Override
public void validate(final FacesContext facesContext, final UIComponent component, final Object value) {
if(value != null) {
final String password = (String)value;
// Moet tussen 8 en 64 lengte zijn
if(password.length() < 8 || password.length() > 64) {
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, getMessage(), getMessage()));
}
}
}
/* ******************** STATE HOLDER ******************** */
/**
* {@inheritDoc}
*/
@Override
public Object saveState(final FacesContext facesContext) {
return new Object[] { message } ;
}
/**
* {@inheritDoc}
*/
@Override
public void restoreState(final FacesContext facesContext, final Object object) {
final Object[] values = (Object[])object;
message = (ValueExpression)values[0];
}
/**
* {@inheritDoc}
*/
@Override
public boolean isTransient() {
return false;
}
/**
* {@inheritDoc}
*/
@Overridev public void setTransient(final boolean isTransient) {
// Niets
}
}
Vervolgen nog een klasse aan maken die extends van ValidatorELTag je die kan includen in je tag-library zodat je deze kan gebruiken in je jspx pagina.
public final class PasswordValidatorTag extends ValidatorELTag {
private static final long serialVersionUID = 1L;
private ValueExpression message;/**
* Zet de foutmelding die getoond moet worden als het veld niet valide is.
* @param message foutmelding
*/
public void setMessage(final ValueExpression message) {
this.message = message;
}/**
* Create validator.
* @return password confirmed validator
*/
@Override
protected Validator createValidator() {
final PasswordValidator validator = new PasswordValidator();
validator.setMessage(message);
return validator;
}
}

Comments are closed.