1

私は JSF と Primefaces を初めて使用し、ログインと基本的なナビゲーションの作業を始めたばかりで、すでに問題に遭遇しています。私はSOで約10の同様の質問をしましたが、解決策はまだありませんでした.

  1. ログイン: ログアウトと同様に問題なく動作するようですが、ブラウザの URL には、ログイン後もログイン画面にいると表示され、Oracle EE6 ドキュメントから直接ログイン例を使用したため、心配です。ログイン方法は以下の通りです。

    public String login(){
    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();
    try{
        logger.log(Level.FINE, "User credentials: name: {0}, password: {1}", new Object[] {this.username, this.password});
        request.login(this.username, encrypt(this.password));
        logger.log(Level.FINE, "User: {0} logged in", this.username);
    }catch(ServletException e){
        logger.log(Level.SEVERE, "User: {0} login failed, password: {1}", new Object[]{this.username, encrypt(this.password)});
        context.addMessage(null, new FacesMessage("Login Failed!"));
        return "error";
    }
    return "/faces/system/index";
    

    }

  2. ログインすると、正しいディレクトリの正しいページに移動し、すべてが正しく表示されますが、リンクにカーソルを合わせると、ブラウザーの下部にあるステータス バーに 3 つのリンクすべてに対して同じ URL が表示されます。以下に示すページのコード。

        <h:body>
        <p:layout fullPage="true">
            <f:facet name="last">
                <h:outputStylesheet library="css" name="discovery.css"></h:outputStylesheet>
            </f:facet>
            <p:layoutUnit styleClass="headerDiv" position="north" size="100">
                <h:graphicImage library="images" name="header.jpg"></h:graphicImage>
            </p:layoutUnit>
            <p:layoutUnit styleClass="navDiv" position="west" size="200" id="navPanel">
                <h:form>
                    <h:outputText value="Navigation Menu"></h:outputText>
                    <br/>
                    <p:commandLink value="First Time Users" update=":main">
                        <f:setPropertyActionListener target="#{navigationBean.pageToDisplay}" value="tutorial.xhtml"></f:setPropertyActionListener>
                    </p:commandLink>
                    <br/>
                    <p:commandLink value="Help" update=":main">
                        <f:setPropertyActionListener target="#{navigationBean.pageToDisplay}" value="help.xhtml"></f:setPropertyActionListener>
                    </p:commandLink>
                    <br/>
                    <h:commandLink action="#{loginBean.logout()}" value="Log Out"></h:commandLink>
                </h:form>
            </p:layoutUnit>
            <p:layoutUnit position="center" id="main">
                <ui:include src="#{navigationBean.pageToDisplay}"></ui:include>
            </p:layoutUnit>
        </p:layout>
    </h:body>
    
  3. ナビゲーション Bean

    @Named(value = "navigationBean") @RequestScoped public class NavigationBean は Serializable {

    public NavigationBean() { }

    public String getPageToDisplay() { return pageToDisplay; }

    public void setPageToDisplay(String pageToDisplay) { this.pageToDisplay = pageToDisplay; }

    private String pageToDisplay = "welcome.xhtml"; }

ナビゲーション Bean に設定されたデフォルト ページにログインした後にページが読み込まれると、ログアウト リンク以外のリンクをクリックすると、中央のレイアウト ユニットからデフォルト ページが消えて空白のページが表示される / ログをクリックするただし、リンクをアウトすると、意図したとおりにログアウトされます。どんな助けでも大歓迎です。

4

1 に答える 1

0

1. ログイン: ログアウトと同様に問題なく動作しているようですが、ブラウザの URL には、ログイン後もログイン画面にいると表示されるため、心配です。

リダイレクトを送信します (これは、指定された URL で新しい GET 要求を送信するようにブラウザーに指示し、ブラウザーのアドレス バーに反映されます)。

return "/faces/system/index?faces-redirect=true";

2. ログイン後、正しいディレクトリの正しいページに移動し、すべてが正しく表示されますが、リンクにカーソルを合わせると、ブラウザの下部にあるステータス バーに 3 つのリンクすべてに対して同じ URL が表示されます。

<h:form>確かに、まったく同じページに送信されます。ページ間のナビゲーションには<h:outputLink>or<h:link>の代わりに使用します。h:commandLink の代わりに h:outputLink を使用する必要がある場合<h:commandLink>も参照してください。


3. ログイン後にページがロードされ、ナビゲーション Bean に設定されているデフォルト ページが表示されているが、ログアウト リンク以外のリンクをクリックすると、中央レイアウト ユニットからデフォルト ページが消え、空白のページが表示される

これは、ページ間のナビゲーションに ajax ポストバックの代わりに GET を使用することで解決されます。そのため、#2 を解決すると本質的に解決されます。NavigationBeanGET 要求をインターセプトするフィルターまたはフェーズ リスナーになるように再設計するだけでよい場合があります。POST でナビゲートするべきではありません。ブックマーク可能性、ユーザー エクスペリエンス、および SEO を打ち負かすのは、まさに今直面しているとおりです。

于 2013-01-16T17:25:53.140 に答える