如何解决如何在我的登录页面JSF 2.0上实现多字段验证
|| 我需要对登录页面进行多字段验证(以相同的方法一次验证了许多字段)。我不知道如何正确实施。我正在跟踪在以下网址找到的示例:http://balusc.blogspot.com/2007/12/validator-for-multiple-fields.html 我在JSF部分有些困惑,有人可以帮我一下,我缺少什么? 这页纸:<h:form>
<p:panel>
<h:outputText value=\"*Em@il:\" />
<h:inputText id=\"email\" value=\"#{securityController.email}\"
required=\"true\" />
<br />
<h:outputText value=\"*Password: \" />
<h:inputSecret id=\"password\" value=\"#{securityController.password}\"
required=\"true\">
<f:validator validatorId=\"loginValidator\" />
</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>
这是带有validate方法的托管bean:
@ManagedBean
@RequestScoped
public class SecurityController implements Validator {
@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 validate,Object value) {
String emailInput = (String) value;
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 inputFromField = (String) value;
String alphanumericPattern = \"^[a-zA-Z0-9]+$\";
Pattern passwordPattern = null;
Matcher passwordMatcher = null;
passwordPattern = Pattern.compile(alphanumericPattern);
passwordMatcher = passwordPattern.matcher(inputFromField);
if (!emailMatcher.matches() && !passwordMatcher.matches()) {
if (authentificationEJB.checkCredentials(email,password) == false) {
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:
@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
Role role = (Role) query.getSingleResult();
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
System.out.println(role.getEmail() + role.getpassword());
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()) {
FacesContext.getCurrentInstance().release();
}
// 2-If 1 then flush it
}
// 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.email) FROM Role r WHERE \"
+ \"r.email=:emailparam AND r.password=:passwordparam\");
checkEmailExists.setParameter(\"emailparam\",email);
checkEmailExists.setParameter(\"passwordparam\",password);
long matchCounter = 0;
matchCounter = (Long) checkEmailExists.getSingleResult();
if (matchCounter > 0) {
return true;
}
return false;
}
}
更新资料
删除了LoginValidator
修改后的托管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,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(\"Zaboraviliste nesto\");
throw new ValidatorException(msg);
}
if (passwordInput.length() <= 0 || emailInput.length() <= 0) {
FacesMessage msg = new FacesMessage(\"Zaboraviliste nesto\");
throw new ValidatorException(msg);
}
}
// Get set methods
}
登录表单:
<h:form>
<p:panel>
<h:outputText value=\"*Em@il:\" />
<h:inputText id=\"email\" value=\"#{securityController.email}\"
binding=\"#{emailComponent}\" />
<br />
<h:outputText value=\"*Password: \" />
<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>
在EJB处修改了saveUserState()方法:
// 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
try {
Role role = (Role) query.getSingleResult();
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;
}
} catch (Exception e) {
// This fix the bug that does not display the message when wrong
// password!
FacesMessage msg = new FacesMessage(\"Pogresan email ili lozinka\");
throw new ValidatorException(msg);
}
// 4-return false otherwise
return false;
}
解决方法
您需要将第一个组件与ѭ6绑定,并将其作为要验证的组件的属性传递。当您要在托管Bean中调用验证器方法时,还需要使用输入字段的7属性而不是8属性。最后,您应该摆脱bean类上的ѭ9。
<h:outputText value=\"*Em@il:\" />
<h:inputText id=\"email\" binding=\"#{emailComponent}\" value=\"#{securityController.email}\" required=\"true\"/>
<br/>
<h:outputText value=\"*Password: \" />
<h:inputSecret id=\"password\" value=\"#{securityController.password}\" validator=\"#{securityController.validateEmailAndPassword}\" required=\"true\">
<f:attribute name=\"emailComponent\" value=\"#{emailComponent}\" />
</h:inputSecret>
与
public void validateEmailAndPassword(FacesContext context,UIComponent component,Object value) throws ValidatorException {
UIInput emailComponent = (UIInput) component.getAttributes().get(\"emailComponent\");
String email = (String) emailComponent.getValue();
String password = (String) value;
// ...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。