1

私のブラウザーは常にリダイレクト ループを返しますが、その理由はわかりません。login.htmlにアクセスすると、いくつかのメソッドが呼び出されているように見えます。

login.html ファイルは次のとおりです。

<ui:composition
    template="/templates/master.xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html">
    <ui:define name="body">

        <div class="container-fluid">
            <div class="row-fluid">
                <div class="span12">
                    <h:form class="form-horizontal">
                        <fieldset>
                            <legend>Bem vindo a Sergio's</legend>
                            <br/>
                            <p>Preencha os campos abaixo para entrar no sistema.</p>
                            <div class="control-group">
                                <label class="control-label" for="user">Usuário</label>
                                <div class="controls">
                                    <h:inputText required="true" id="user" value="#{loginController.username}" class="input-medium" />
                                    <h:message for="user" />
                                </div>
                            </div>
                            <div class="control-group">
                                <label class="control-label" for="password">Senha</label>
                                <div class="controls">
                                    <h:inputSecret required="true" id="password" value="#{loginController.password}" class="input-medium"/>
                                    <h:message for="password" />
                                </div>
                            </div>
                            <div class="form-actions">
                                <h:commandButton action="#{loginController.login()}" class="btn btn-primary" value="Entrar"/>
                            </div>
                        </fieldset>
                    </h:form>
                    <h:messages/>
                </div>
            </div>
        </div>

    </ui:define>
</ui:composition>

そして、これが LoginController です。

package com.erp3.gui.controllers;

import java.io.IOException;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

@ManagedBean
public class LoginController {

    public Boolean isLoggedIn = false;
    private String username;
    private String password;
    private FacesMessage facesMessage;
    public ExternalContext externalContent;

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Boolean getIsLoggedIn() {
        return isLoggedIn;
    }

    public void setIsLoggedIn(Boolean isLoggedIn) {
        this.isLoggedIn = isLoggedIn;
    }

    public void login() throws IOException {
        if (this.getUsername().equals("daniel") && this.getPassword().equals("123")) {
            this.isLoggedIn = true;
            externalContent = FacesContext.getCurrentInstance().getExternalContext();
            externalContent.getSessionMap().put("loginController", this);
            externalContent.redirect(externalContent.getRequestContextPath() + "/views/home.html");
        } else {
            this.isLoggedIn = false;
            facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Usuário ou senha inválida.", username);
            FacesContext.getCurrentInstance().addMessage(null, facesMessage);
            externalContent.redirect(externalContent.getRequestContextPath() + "/views/login.htm");
        }
    }

    public void logOut() throws IOException {
        externalContent = FacesContext.getCurrentInstance().getExternalContext();
        externalContent.getSessionMap().remove("loginController");
        externalContent.redirect(externalContent.getRequestContextPath() + "/views/login.html");
    }

}

テンプレートである master.html があり、このコンテンツで top.html を呼び出しています。

<ui:composition
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <div class="navbar navbar-fixed-top">
        <div class="navbar-inner">
            <div class="container-fluid">
                <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </a>
                <a class="brand" href="#">Project name</a>
                <div class="btn-group pull-right">
                    <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
                        <i class="icon-user"></i>
                        <span class="caret"></span>
                    </a>
                    <ul class="dropdown-menu">
                        <li><a href="#">Conta</a></li>
                        <li class="divider"></li>
                        <li><a href="#{loginController.logout}">Sair</a></li>
                    </ul>
                </div>
                <div class="nav-collapse">
                    <ul class="nav">
                        <li class="active"><a href="#">Home</a></li>
                        <li><a href="#about">About</a></li>
                        <li><a href="#contact">Contact</a></li>
                    </ul>
                </div>
            </div>
        </div>
    </div>
</ui:composition>
4

2 に答える 2

1

で問題が見つかりました。リンクをtop.html呼び出しloginController.logOut()ていますが、自動実行の理由がわかりません。クリックを待っていないので、<a>forを変更しました<h:commandLink/>

于 2012-04-26T18:59:26.680 に答える
1

テンプレート テキスト内の EL 式は、レンダリング レスポンス中にすぐに評価され、値式として扱われます。つまり、戻り値は HTML 出力の一部として出力されます。「プレーン バニラ」HTMLテンプレート テキストです。したがって、次の

<li><a href="#{loginController.logOut()}">Sair</a></li>

基本的にメソッドを呼び出し、hrefレンダリング応答中にその戻り値を URL として出力します。結果の HTML は次のようになります。

<li><a href="">Sair</a></li>

(はい、有効な代わりにhref実際に返されたため、 は空ですvoidString)

しかし、そのメソッド内では、JSF にログイン ページにリダイレクトするように指示しているため、無限ループに陥ります。

これはあなたが実際に望むものではありません。これをバッキング Bean アクション メソッドとして呼び出すつもりです。UICommandこれには、 などの完全な JSF コンポーネントを使用する必要があります<h:commandLink>

<li><h:form><h:commandLink value="Sair" action="#{loginController.logOut()}" /></h:form></li>

このようにlogOut()して、完全なナビゲーション結果を返すようにメソッドを変更することもできます:

public String logOut() {
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
    return "/views/login.html?faces-redirect=true";
}

ExternalContext#redirect()、JSF 以外の URL にリダイレクトする場合、または実際にアクション メソッド内にいない場合にのみ使用することになっています。

于 2012-04-26T19:05:54.837 に答える