在preRenderView事件上使用bean的JSF永久重定向

时间:2014-05-22 04:01:55

标签: jsf jsf-2

有没有办法使用faces-config导航永久重定向到preRenderEvent视图中的页面?

例如,登录后它将在页面上重定向,在该页面上我需要知道用户的角色,以便我可以将他重定向到正确的页面。

我使用它来重定向:

<f:metadata>
    <f:event listener="#{loginRedirectBean.redirect}" type="preRenderView"></f:event>
</f:metadata>

public void redirect() throws IOException {
    if (identity.isLoggedIn()) {
        if(hasRole("admin")) {
            ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
            context.redirect("faces.admin");
        }
    }
}

2 个答案:

答案 0 :(得分:2)

你应该如此使用&#34; if else&#34;基于用户角色的陈述:

public void redirect(){
    ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
    if (context.isUserInRole("admin"){
        context.redirect("adminpage");
    }
    else if (context.isUserInRole("user"){
        context.redirect("userpage");
    }
          // other possible roles
    else context.redirect("homepage");
}

无关:为了避免在用户登录时向服务器发出双重请求,我建议将该逻辑在方法redirect()中实现,转移到该方法用户负责用&#34; if else&#34;语句并返回String返回结果(无需按上述方式手动重定向)以指定正确的页面名称以进行重定向,具体取决于&#34中的用户角色;如果&#34 ;指令。

答案 1 :(得分:0)

因为faces-config导航。我刚刚使用了具有特定角色的文件。

public void redirect() throws IOException {
    String redirectUrl = "login.jsf";
    if (identity.isLoggedIn()) {
        try {
            User user = ((PicketlinkUser) identity.getAccount()).getUser();
            if (user.hasRole(Role.ROLE_ADMIN)) {
                redirectUrl = "pages/secured/" + Role.ROLE_ADMIN + "/index.jsf";
            } else if (user.hasRole(Role.ROLE_BRIDE)) {
                redirectUrl = "pages/secured/" + Role.ROLE_BRIDE + "/index.jsf";
            } else if (user.hasRole(Role.ROLE_VENDOR)) {
                redirectUrl = "pages/secured/" + Role.ROLE_VENDOR + "/index.jsf";
            } else if (user.hasRole(Role.ROLE_COLLABORATOR)) {
                redirectUrl = "pages/secured/" + Role.ROLE_COLLABORATOR + "/index.jsf";
            } else {
                log.info("user={} has no valid role?", user);
                redirectUrl = "index.jsf";
            }
        } catch (NullPointerException e) {
            log.error("no role?={}", e.getMessage());
        }
    } else {
        log.error("isNotLoggedIn, redirect to login.");
    }

    ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
    context.redirect(redirectUrl);
}