当用户输入错误的密码时,验证信息不会以登录形式显示
|
我试图理解为什么当密码输入错误时,我的登录表单为何不显示验证消息“错误的电子邮件或密码”。在所有其他情况下,它都可以正常工作(只是情况4不起作用):
情况1没问题(没有输入):
情况2可以正常工作(仅输入电子邮件):
情况3没问题(仅输入密码):
情况4不起作用(两个输入均输入错误)
情况4不能正常工作,这里是源代码:
JSF页面上的表单:
<h:form>
<p:panel>
<h:outputText value=\"*Em@il:\" />
<h:inputText id=\"email\" value=\"#{securityController.email}\" binding=\"#{emailComponent}\"/>
<br/>
<h:outputText value=\"*Lozinka: \" />
<h:inputSecret id=\"password\" value=\"#{securityController.password}\" validator=\"#{securityController.validate}\">
<f:attribute name=\"emailComponent\" value=\"#{emailComponent}\" />
</h:inputSecret>
<br/>
<span style=\"color: red;\"><h:message for=\"password\"
showDetail=\"true\" /></span>
<br/>
<h:commandButton value=\"Login\" action=\"#{securityController.logIn()}\"/>
</p:panel>
</h:form>
从输入字段获取值的托管bean
@ManagedBean
@RequestScoped
public class SecurityController {
@EJB
private IAuthentificationEJB authentificationEJB;
private String email;
private String password;
private String notificationValue;
public String logIn() {
if (authentificationEJB.saveUserState(email, password)) {
notificationValue = \"Dobro dosli\";
return \"main.xhtml\";
} else {
return \"\";
}
}
public void validate(FacesContext context, UIComponent component,
Object value) throws ValidatorException {
UIInput emailComponent = (UIInput) component.getAttributes().get(
\"emailComponent\");
String email = \"\";
String password = \"\";
email = (String) emailComponent.getValue();
password = (String) value;
String emailInput = email;
String emailPatternText = \"^[_A-Za-z0-9-]+(\\\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\\\.[A-Za-z0-9]+)*(\\\\.[A-Za-z]{2,})$\";
Pattern emailPattern = null;
Matcher emailMatcher = null;
emailPattern = Pattern.compile(emailPatternText);
emailMatcher = emailPattern.matcher(emailInput);
String passwordInput = password;
String alphanumericPattern = \"^[a-zA-Z0-9]+$\";
Pattern passwordPattern = null;
Matcher passwordMatcher = null;
passwordPattern = Pattern.compile(alphanumericPattern);
passwordMatcher = passwordPattern.matcher(passwordInput);
if (!emailMatcher.matches() && !passwordMatcher.matches()) {
if (authentificationEJB.checkCredentials(emailInput, passwordInput) == false) {
FacesMessage msg = new FacesMessage(
\"Pogresan email ili lozinka\");
throw new ValidatorException(msg);
}
}
if(emailInput == null || passwordInput == null) {
FacesMessage msg = new FacesMessage(\"Pogresan email ili lozinka\");
throw new ValidatorException(msg);
}
if (passwordInput.length() <= 0 || emailInput.length() <= 0) {
FacesMessage msg = new FacesMessage(\"Pogresan email ili lozinka\");
throw new ValidatorException(msg);
}
}
public String getEmail() {
return email;
}
public String getPassword() {
return password;
}
public void setEmail(String email) {
this.email = email;
}
public void setPassword(String password) {
this.password = password;
}
public String getNotificationValue() {
return notificationValue;
}
public void setNotificationValue(String notificationValue) {
this.notificationValue = notificationValue;
}
}
访问数据库并检查凭据的EJB:
package ejbs;
import java.util.List;
import javax.ejb.Stateful;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import ejbinterfaces.IAuthentificationEJB;
import entities.Role;
@Stateful(name = \"ejbs/AuthentificationEJB\")
public class AuthentificationEJB implements IAuthentificationEJB {
@PersistenceContext
private EntityManager em;
// Login
public boolean saveUserState(String email, String password) {
// 1-Send query to database to see if that user exist
Query query = em
.createQuery(\"SELECT r FROM Role r WHERE r.email=:emailparam AND r.password=:passwordparam\");
query.setParameter(\"emailparam\", email);
query.setParameter(\"passwordparam\", password);
// 2-If the query returns the user(Role) object, store it somewhere in
// the session
List<Object> tmpList = query.getResultList();
if (tmpList.isEmpty() == false) {
Role role = (Role) tmpList.get(0);
if (role != null && role.getEmail().equals(email)
&& role.getPassword().equals(password)) {
FacesContext.getCurrentInstance().getExternalContext()
.getSessionMap().put(\"userRole\", role);
// 3-return true if the user state was saved
System.out.println(role.getEmail() + role.getPassword());
return true;
}
}
// 4-return false otherwise
return false;
}
// Logout
public void releaseUserState() {
// 1-Check if there is something saved in the session(or wherever the
// state is saved)
if (!FacesContext.getCurrentInstance().getExternalContext()
.getSessionMap().isEmpty()) {
// 2-If 1 then flush it
FacesContext.getCurrentInstance().release();
}
}
// Check if user is logged in
public boolean checkAuthentificationStatus() {
// 1-Check if there is something saved in the session(This means the
// user is logged in)
if ((FacesContext.getCurrentInstance().getExternalContext()
.getSessionMap().get(\"userRole\") != null)) {
// 2-If there is not a user already loged, then return false
return true;
}
return false;
}
@Override
public boolean checkCredentials(String email, String password) {
Query checkEmailExists = em
.createQuery(\"SELECT COUNT(r) FROM Role r WHERE r.email=:emailparam AND r.password=:passwordparam\");
checkEmailExists.setParameter(\"emailparam\", email);
checkEmailExists.setParameter(\"passwordparam\", password);
int matchCounter = 0;
matchCounter = checkEmailExists.getResultList().size();
if (matchCounter == 1) {
return true;
}
return false;
}
}
没有找到相关结果
已邀请:
1 个回复
播匣扦阔食
因此,当电子邮件不匹配且密码不匹配且凭据不匹配时,将显示错误消息。 这不是您想要的。在第4种情况下,电子邮件确实匹配。你要这个:
当电子邮件不匹配或密码不匹配或凭据不匹配时,将显示错误。