0

我有这个登录表单:

<h:form>
    <h:panelGrid columns="2" >
        <h:outputLabel for="username" value="Login:"/>
        <h:inputText id="username" value="#{userController.userName}" required="true"/>
        <h:outputLabel for="password" value="#{msg.password}"/>
        <h:inputSecret id="password" value="#{userController.password}" required="true"/>
        <h:column/>
        <h:commandButton value="#{msg.login}" action="#{userController.login}"/> 
        </h:panelGrid>
</h:form>

使用这个支持 bean:

@ManagedBean(name = "userController")
@SessionScoped
public class UserController {
  private String userName = "";
  private String password = "";

  //getter, setters

  public String login(){
    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();
    try {
        request.login(userName, password);
    } catch (ServletException e) {
    }            

    return "next-page.xhtml"; //if login processes is proper, i redirect to next page 
   }
}

我阅读了JSF 的最佳实践:模型、动作、getter、导航、阶段监听

我总是发回同一个视图(返回 null 或 void,然后有条件地渲染/包含结果。对于页面到页面导航,我不使用 POST 请求(对于导航案例是强制性的),因为这对UX(用户体验;浏览器后退按钮的行为不正常,浏览器地址栏中的 URL 总是落后一步,因为默认情况下它是转发,而不是重定向)和 SEO(搜索引擎优化;搜索机器人不索引 POST 请求). 我只是使用输出链接甚至纯 HTML 元素进行页面到页面导航。

那么,当我的登录正确并且我想立即重定向到时我应该怎么做next-page.xhtml

4

1 回答 1

1

在 的末尾try,执行导航以执行?faces-redirect=true重定向。在 中catch,返回null以使其停留在同一页面中。

try {
    request.login(userName, password);
    return "next-page.xhtml?faces-redirect=true";
} catch (ServletException e) {
    context.addMessage(null, new FacesMessage("Unknown login"));
    return null;
}            

为了完整起见,我在登录失败时添加了一条面孔消息,否则最终用户将不知道为什么页面似乎在没有任何形式的反馈的情况下重新加载。此消息将显示在<h:messages globalOnly="true">.

也可以看看:

于 2013-11-11T17:25:33.257 回答