微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在我的登录页面JSF 2.0上实现多字段验证

如何解决如何在我的登录页面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 举报,一经查实,本站将立刻删除。