1

我是 JSF 和 Primefaces 的新手,刚刚开始研究登录和基本导航,我已经遇到了问题。我在这里遇到了大约 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. 登录后,我被带到正确目录中的正确页面,并且所有内容都正确显示,但是当您将鼠标悬停在链接上时,浏览器底部的状态栏会为所有三个链接显示相同的 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. NavigationBean

    @Named(value = "navigationBean") @RequestScoped 公共类 NavigationBean 实现可序列化 {

    公共 NavigationBean() { }

    public String getPageToDisplay() { return pageToDisplay; }

    公共无效 setPageToDisplay(String pageToDisplay) { this.pageToDisplay = pageToDisplay; }

    私有字符串 pageToDisplay = "welcome.xhtml"; }

登录后页面加载时,显示导航 bean 中设置的默认页面,但单击注销链接以外的任何链接会导致默认页面从中心布局单元中消失并显示空白页面/单击日志out 链接确实会按预期将您注销。任何帮助将不胜感激。

4

1 回答 1

0

1. 登录:似乎和注销一样可以正常工作,但我很担心,因为浏览器中的 url 仍然显示登录后我在登录屏幕。

发送重定向(这指示浏览器在给定的 URL 上发送新的 GET 请求,该请求会反映在浏览器的地址栏中)。

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

2. 登录后,我被带到正确目录中的正确页面,并且所有内容都正确显示,但是当您将鼠标悬停在链接上时,浏览器底部的状态栏会为所有三个链接显示相同的 url。

<h:form>确实提交到同一页面。使用<h:outputLink>or<h:link>代替<h:commandLink>页面到页面的导航。另请参阅何时应该使用 h:outputLink 而不是 h:commandLink?


3. 登录后页面加载时,显示导航bean中设置的默认页面,但点击退出链接以外的任何链接,导致默认页面从中心布局单元消失,并显示空白页面

这是通过使用 GET 而不是 ajax 回发进行页面到页面导航来解决的。因此,在解决 #2 时,它本质上就解决了。您可能只想将您重新设计NavigationBean为过滤器或阶段侦听器,它也会拦截 GET 请求。您根本不应该通过 POST 导航。它破坏了可收藏性、用户体验和 SEO,就像您现在遇到的一样。

于 2013-01-16T17:25:53.140 回答