简体   繁体   English

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

[英]How to implement multiple field validation at my Login page(JSF 2.0)

I need a multiple field validation for login page (many fields validated at once in the same method). 我需要对登录页面进行多字段验证(以相同的方法一次验证了许多字段)。 I don't know how to implement it correctly. 我不知道如何正确实施。 I am following an example I found at: http://balusc.blogspot.com/2007/12/validator-for-multiple-fields.html 我正在跟踪以下示例: http : //balusc.blogspot.com/2007/12/validator-for-multiple-fields.html

I get a bit confused in the JSF part.Can somebody give me a hand, what am I missing? 我在JSF部分有些困惑,有人可以帮我一下,我缺少什么?

The page: 这页纸:

<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>

This is the managed bean with the validate method: 这是带有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 that interacts with database to check credentials: 与数据库交互以检查凭证的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;
    }
}

Update 更新资料

Removed LoginValidator 删除了LoginValidator

The modified managed bean: 修改后的托管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("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
}

The login form: 登录表单:

<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>

Modified The saveUserState() method at the EJB: 在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;
}

You need to bind the first component by binding and pass it as attribute of the component you're validating. 你需要通过向第一组件绑定binding ,并把它作为你验证组件的属性。 You also need to use validator attribute of the input field instead of <f:validator> when you want to call a validator method inside a managed bean. 当您要在托管Bean中调用Validator方法时,还需要使用输入字段的validator属性而不是<f:validator> Finally you should get rid of the implements Validator on the bean class. 最后,您应该摆脱bean类上的implements Validator

<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> 

with

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;

    // ...
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM