如何将JSF中的所有请求重定向到一个页面?

时间:2014-02-21 07:34:59

标签: java jsf

我想将用户重定向到更改密码页面,只要他们没有更改密码。可以从SessionScoped Bean获得此状态。

如何全局修改所有链接和结果,以便将需要更改密码的用户重定向到更改密码页?

即使他们尝试通过网址访问网页,这也应该有用。

这可以通过JSF实现吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您通常应该使用ServletFilter。您可以访问ManagedBeanHttpSession

答案 1 :(得分:1)

可能您可以使用阶段监听器实现此目的。例如:

public class MyPhaseListener implements PhaseListener {

    @Override
    public void afterPhase(PhaseEvent event) {
        System.out.println("afterPhase with ID : " + event.getPhaseId());
    }

    @Override
    public void beforePhase(PhaseEvent event) {
        // Do not exceute subsequent phases if sending a redirect
        event.getFacesContext().responseComplete();
        try {
            ((HttpServletResponse)event.getFacesContext().getExternalContext().getResponse()).sendRedirect("http://stackoverflow.com");
        } catch (IOException ex) {
            Logger.getLogger(MyPhaseListener.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }
}

在faces-config.xml中注册监听器

<faces-config version="2.2"
              xmlns="http://xmlns.jcp.org/xml/ns/javaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
    <lifecycle>
        <phase-listener>MyPhaseListener</phase-listener>
    </lifecycle>

</faces-config>