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.

Algemeen (8)
GlassFish (43)
Java (56)
Managed Services (9)
Oracle (88)
Private Cloud Hosting (2)
SOA/BPEL/ESB (6)
Software development (40)
Strategie (6)
WSO2 (2)

WP Cumulus Flash tag cloud by Roy Tanck requires Flash Player 9 or better.

  • 071 - 82 000 82
  • Rijndijk 137 | 2394 AG Hazerswoude-Rijndijk
Oracle SOA specialized partner
Java
GlassFish
WSO2
DEMO
i-bridge
Rabobank
Greencat
Jan de Rijk
Reuma Revalidatie Rotterdam
Robeco
VU Medisch Centrum
CHS
LUMC
TomTom
TKP
NCCW
Erasmus MC
UMCG
VIR
ANWB
BVA Auctions
D-Reizen
STEDIN