1

我正在尝试使用 jsf 2.0 表单对用户进行身份验证。我还想创建 UserPrincipals。我认为使用 HttpServletRequest.login 方法可以创建一个新的 UserPrincipal。 http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html

我所做的是:

配方:

    <h:form>
        <h:outputLabel value="Name" for="name"/>
        <h:inputText id="name" value="#{userMng.user.name }"/>
        <br/>
        <h:outputLabel value="Passwort" for="pw"/>
        <h:inputSecret id="pw" value="#{userMng.user.password }"/>
        <br/>
        <h:commandButton type="submit" value="Submit" action="#{ userMng.login }"/>
    </h:form>

UserMng(sessionscoped):登录方式:

public String login() {
        String ret = "error";
        if (user.getName().equals("test") && user.getPassword().equals("test") ) {
            FacesContext context = FacesContext.getCurrentInstance();
            HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();

        try {
            request.login(this.user.getName(), this.user.getPassword());
            LOGGER.info("Login the user");
            ret = "success";
//          this.user = userDAO.find(this.username, this.password);
        } catch (ServletException e) {
            // Handle unknown username/password in request.login().
            context.addMessage(null, new FacesMessage("Unknown login"));
        }
    }
    LOGGER.info(ret);
    return ret;
}

但是,当我想在登录后打印 UserPrincipal.getName 时,我会在调用时收到 NullpointerException:

request.getUserPrincipal().getName();

那么我的代码或成功登录后创建新 UserPrincipal 的方式有什么问题?

最好的

4

1 回答 1

3

用户主体仅在登录后的后续请求中可用。您需要在登录后发送重定向以强制浏览器创建新请求。

ret = "success?faces-redirect=true";

在视图中打印用户名时,最好使用 EL。已HttpServletRequest在 EL 中提供#{request}

<p>Welcome #{request.userPrincipal.name}!</p>

或者只是捷径

<p>Welcome #{request.remoteUser}!</p>
于 2012-05-24T13:35:27.283 回答