URL重定向不适用于preRenderView事件

时间:2015-09-12 21:59:52

标签: jsf redirect jsf-2.2 prerenderview

我终于在页面之间传递了消息,但这并没有将我重定向到用户登录页面(../../index.xhtml),而是显示了禁止页面:

if (dataStr != null){

    try {
        int data=Integer.parseInt(dataStr);
        JOptionPane.showMessageDialog(null,"Ok"+data);
    } catch (NumberFormatException nfe) {
        // notify user that input was invalid
    }

}

当然,限制页面有这个:

public String permission() throws IOException {
    FacesContext context = FacesContext.getCurrentInstance();
    Map<String, Object> sessionMap = context.getExternalContext().getSessionMap();
    String isLog = (String) sessionMap.get("isLogged");

    if(isLog != "TRUE") {

        System.out.println("*** The user has no permission to visit this page. *** ");
        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Info : ", "Loggez-vous"));
        context.getExternalContext().getFlash().setKeepMessages(true);
        //context.getExternalContext().redirect("../../index.xhtml");
        return "../../index.xhtml?faces-redirect=true";


    } else {
        System.out.println("*** The session is still active. User is logged in. *** ");
    }
    return "../../index.xhtml?faces-redirect=true";
}

使用get external context重定向会使邮件丢失。

2 个答案:

答案 0 :(得分:5)

忽略一般设计问题(看起来here为起点),似乎你混淆了新的JSF 2.2 <f:viewAction>和旧的JSF 2.0 / 2.1 <f:event type="preRenderView">技巧。

只有String支持在GET请求中返回<f:viewAction>的导航结果,而不是<f:event type="preRenderView">。对于后者,您需要ExternalContext#redirect(),而您恰好已经过了评论。

所以,你应该做任何一个

<f:event type="preRenderView" listener="#{bean.onload}"/>
public void onload() throws IOException {
    // ...
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.redirect(ec.getRequestContextPath() + "/index.xhtml");
}

<f:metadata>
    <f:viewAction action="#{bean.onload}"/>
</f:metadata>
public String onload() {
    // ...
    return "/index.xhtml"; // Note: no need for faces-redirect=true!
}

并且不要混淆它们。

请注意,我以这样的方式编写代码,您可以始终使用/path相对于Web根目录,而无需使用../废话。

另见:

答案 1 :(得分:0)

使用 faces-redirect = true时,您需要从根上下文指定绝对路径

所以结果字符串应如下所示:

return "/dir1/dir2/index.xhtml?faces-redirect=true";

如果index.xhtml位于(上下文根),即 Web内容 /index.xhtml,则使用此结果字符串:

return "/index.xhtml?faces-redirect=true";

如果index.xhtml位于 Web内容 /pages/dir2/index.xhtml中,则使用此结果字符串:

return "/pages/dir2/index.xhtml?faces-redirect=true";