渲染页面前的验证

时间:2011-06-17 10:15:29

标签: jsf-2

我是JSF的新手,并使用JSF2构建一个包含多个页面的webapp。我正在使用会话范围的bean来保存通过浏览不同页面设置的一些参数。

当会话超时(或我重新部署应用程序)并且我转到特定页面时,此页面无法正确呈现,因为会话中缺少某些数据。此时我希望显示主页。

我想对所有页面使用此机制。所以一般来说,我想在渲染页面之前做一些验证,如果验证失败,则将用户引导到主页。

我该如何处理?

1 个答案:

答案 0 :(得分:4)

在这种特殊情况下,我会使用一个简单的filter来挂接JSF请求,并检查会话中是否存在托管bean。以下示例假定以下内容:

  • FacesServletweb.xml中定义为<servlet-name>facesServlet</servlet-name>
  • 您的会话范围bean的托管bean名称为yourSessionBean
  • 您的主页位于home.xhtml

@WebFilter(servletName="facesServlet")
public class FacesSessionFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession(false);

        if (!request.getRequestURI().endsWith("/home.xhtml") && (session == null || session.getAttribute("yourSessionBean") == null)) {
            response.sendRedirect(request.getContextPath() + "/home.xhtml"); // Redirect to home page.
        } else {
            chain.doFilter(req, res); // Bean is present in session, so just continue request.
        }
    }

    // Add/generate init() and destroy() with empty bodies.
}

或者,如果您想更多地使用JSF-ish,请在主模板中添加<f:event type="preRenderView">

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

@ManagedProperty(value="#{yourSessionBean}")
private YourSessionBean yourSessionBean;

public void preRenderView() {
    if (yourSessionBean.isEmpty()) {
        yourSessionBean.addPage("home");
        FacesContext.getCurrentInstance().getExternalContext().redirect("/home.xhtml");
    }
}