1

これが私のコードです:

<h:form>
    <h:messages errorClass="errorMessage" infoClass="infoMessage"
                warnClass="warnMessage"></h:messages>
    <h:panelGroup id="login" layout="block" rendered="#{!securityBean.authorized}">
        <h:outputText value="login:"/>
        <h:inputText id="username" value="#{securityBean.username}"/>
        <h:outputText value="password:"/>
        <h:inputSecret id="password" value="#{securityBean.password}"/>
        <h:commandButton value="login" action="#{securityBean.login}"/>
    </h:panelGroup>

    <h:panelGroup id="logout" layout="block" rendered="#{securityBean.authorized}">
        <h:graphicImage id="img" library="img" name="login_success.jpg"/>
        <h:commandButton value="logout" action="#{securityBean.logout}"/>
    </h:panelGroup>
</h:form>

ここにバッキングBeanメソッドがあります

    public Object login() throws ServletException {
        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        try {
            request.login(username, password);
        } catch (ServletException e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "An Error Occured: Login failed", null));
            e.printStackTrace();
        }
        return null;
    }

    public Object logout(){
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        if(session != null){
            session.invalidate();
        }
        return null;
    }
    public boolean isAuthorized() {
        return FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal() != null &&
                FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName() != null &&
                !FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName().isEmpty();
    }

ログイン後、ログアウトボタンが表示されますが、2回目のクリックでのみ機能します。ご覧のとおり、ここではajaxが使用されていないため、このhttp://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#AjaxRenderingOfContentWhichContainsAnotherFormは役に立ちません。正しい?前もって感謝します。

4

2 に答える 2

4

ログアウト後にホームページなどにリダイレクトする必要があるため(nullではなく結果を使用)、この問題が発生していると思います。私はその問題を抱えていました、そして私はこのように解決しました:

public String logout(){
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
    if(session != null){
        session.invalidate();
    }
    return "redirectToHomePageAfterLogout";
}

お役に立てれば!:)

于 2012-07-23T22:07:51.033 に答える
0

これは、フォーム送信の応答URLがそれを生成した要求と同じであるためです。これにより、URLは常に実際の場所より1つ遅れているという効果が得られます。

URLに?faces-redirect = trueの接尾辞を付けて、JSFに転送ではなくリダイレ​​クトを強制することができます。

より良い概要はここにあります

ただし、logOutアクションは、logOut関数の完了後に移動するページの名前を指定するString()を返す必要があります。

于 2012-07-24T16:27:28.327 に答える