2014-09-30 14 views
5

Çok araştırdım ve bir çözüm bulamadım.Doğrulama hatasından sonra giriş değeri temizlenmiyor

ben JSF 2.1 ve richfaces 4.2.3 kullanarak ve kullanıcıya

giriş bilgilerini İki giriş alanlara sahip doğrulamak oluşturmak istiyorum. Bir kullanıcı adı ve bir Şifre, hem @NotEmpty

ile login.xhtml

<html 
xmlns="http://www.w3.org/1999/xhtml" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:rich="http://richfaces.org/rich" 
xmlns:a4j="http://richfaces.org/a4j" 
xmlns:mt="http://java.sun.com/jsf/composite/components"> 
<h:body> 
<ui:composition template="/protected/user/login-template.xhtml"> 
    <ui:define name="panel-navigation"> 
     <ui:include src="/protected/user/login-left-menu.xhtml" /> 
    </ui:define> 
    <ui:define name="contentbody"> 
     <h:form> 
      <div id="content"> 
       <div class="subcolumns"> 
        <div class="c65l"> 
         <div class="subcl"> 
          <p class="sum-error-message" /> 
          <fieldset> 
           <h3> 
            <h:outputText value="#{styleguideMessages.login}" /> 
           </h3> 
           <p> 
            <h:outputText value="#{messages.login_text}" /> 
           </p> 
           <div class="subcolumns"> 
            <mt:inputText 
             id="loginName" 
             value="#{authenticationPM.loginName}" 
             label="#{messages.general_label_loginname}" 
             required="true" /> 
            <div class="c33r validation"></div> 
           </div> 
           <div class="subcolumns"> 
            <mt:inputText 
             id="password" 
             value="#{authenticationPM.password}" 
             label="#{styleguideMessages.db_password}" 
             required="true" 
             secret="true" /> 
            <div class="c33r validation"></div> 
           </div> 
           <div class="subcolumns"> 
            <h:commandLink 
             id="loginButton" 
             action="#{authenticationPM.doLogin}" 
             value="#{styleguideMessages.login}" 
             title="#{styleguideMessages.login}" 
             styleClass="button last" /> 
           </div> 
          </fieldset> 
         </div> 
        </div> 
       </div> 
      </div> 
      <mt:commandButton 
       id="login" 
       action="#{authenticationPM.doLogin}" 
       value="hidden" 
       style="visibility:hidden" /> 
     </h:form> 
     <script 
      src="#{facesContext.externalContext.requestContextPath}/js/lib/loginEnter.js" 
      type="text/javascript" 
      charset="utf-8"></script> 
    </ui:define> 
</ui:composition> 

AuthentificationPM.java

import *; 

@Named 
@SessionScoped 
public class AuthenticationPM extends AbstractPM implements Serializable { 

/** 
* The user name from the login. 
*/ 
private String userName; 

/** 
* password. 
*/ 
private String password; 

/** 
* Returns the login name. 
* 
* @return String 
*/ 
@NotNull 
@Pattern(regexp = "^[^\"/\\[\\]:;|=,+?*<>]*$", message = "{user.loginname.pattern}") 
public String getLoginName() { 
    return userName; 
} 

/** 
* Returns the password. 
* 
* @return String 
*/ 
@NotNull 
public String getPassword() { 
    return password; 
} 

/** 
* Sets the login name. 
* 
* @param loginName 
*   - the login name of the user 
*/ 
public void setLoginName(String loginName) { 
    this.userName = loginName; 
} 

/** 
* Sets the password. 
* 
* @param password 
*   - the password of the user 
*/ 
public void setPassword(String password) { 
    this.password = password; 
} 

} 

onlardan biri (derseniz şifre) n Dolu, doğrulama başarısız olur ve bir mesaj gösterilir (gerektiği gibi).

Şimdi kullanıcı adını siliyorum ve bir şifre yazalım. Kullanıcı adı boş olduğundan doğrulama başarısız olur. Şifre alanını temizler ve kullanıcı adı için bir mesaj görüntüler.

Ve şimdi hata olur: eski kullanıcı adı yeniden belirir! Bu davranışı nasıl önleyebilirim?

I işlem doğrulama sonra güncelleme modeli ve çağırmak uygulama atlanır ve yanıt yürütülür hale değer olduğunu biliyoruz. As described here.yanıtı, ui bileşeninde saklanan değerleri alır (istekleri) ve geçersiz değeri silmek yerine yeniden oluşturmak için bunları kullanır.

this solution ve this idea denedim. Her iki yol da bileşenimi bulamıyor.

Herhangi bir yardım veya fikir çok takdir edilmektedir.

Selamlar, Kevin

+0

Bana göre tarayıcı, sayfa –

+2

Valar Morghulis sayfasını önbelleğe alır! Önbelleği belirtilen [burada] devre dışı bıraktım (http://stackoverflow.com/questions/5690269/disabling-chrome-cache-for-website-development). Geliştirdiğimiz ortam, tarayıcıların yine de sayfayı önbelleğe almasına izin vermiyor. Yani sebep bu değil. Yine de teşekkürler! – Wavemaster

cevap

3

sadece inputfield gelen kullanıcı adı silerseniz, değer adı için yasal bir yedek olurdu bir empty string olarak sunulmalıdır ve ayrıca tanımlanmış desen eşleşir.

Ben sadece siz web.xml''deki

<context-param> 
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> 
    <param-value>true</param-value> 
</context-param> 

yapılandırılmış olması, varsayabiliriz. Yani, boş bir alanı teslim etmeye çalıştığınızda, null olarak yorumlanır, bu @NotNull Kullanıcı adı özniteliğindeki Ek Açıklama ile eşleşmez. Bu nedenle, değerin ayarlanması iptal edilir ve önceki durumunu koruyacaktır, bu nedenle SessionScoped - bir kez girilmiş olan kullanıcı adıdır.

En azından bu bir (STRING) değer boş dize Tahmin edebiliyorum sunulduğunda güncellenmez sadece Szenario olduğunu.

Bu değerin true olarak ayarlanması, tanımladığınız davranışı yeniden oluşturmanıza olanak tanır.


Silmek için şifre girdiğiniz metin kutunuz için bu neden geçerli değildir? secret="true" kullandığınız için, metin kutusu, destekleyici özniteliği sıfır olarak ayarlanmış olsa bile (parola kaldırıldıktan sonra) ve yine de yanlış parola içeriyor olsa bile girilen dize (yani uzunluk) hakkında herhangi bir bilgi göstermez.

Ancak, bu özniteliği kaldırmanın, diğer devlerin empty string yerine null almak için güvendikleri işlevselliği bozabileceğini unutmayın. Bu nedenle, @NotNull ek açıklamasını kaldırmayı düşünmeniz ve null'un manuel olarak kontrol edilmesi gerekir.

+1

Cevabınız için teşekkür ederiz. Kesinlikle beni doğru yönde zorluyor. Görünüşe göre, 'ı korumak zorundayım ama şimdi biliyorum ki _why_, onun yaptığı gibi davranıyor. Kullanıcı adı değerini "" "olarak ayarlarken bakla validasyonunu sürdürmenin herhangi bir yolu var mı? Çünkü şifrenin geçerliliği nedeniyle kodumu girmeyecek. – Wavemaster

İlgili konular