1

jsf2.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 に答える