有没有办法使用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");
}
}
}
答案 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);
}