2

ViewExpiredException正在通过重定向到登录屏幕来处理。问题是异常仍然被记录,客户强烈希望没有server.log异常。

虽然在这种情况下这可能是一个有问题的要求,但我仍然必须实现它。我们使用 Mojarra 并在 JBoss EAP 5.1 上部署

MyFaces 方法没有帮助,因为我显然无法包装MyFacesServlet使用 Mojarra

我无法应用JBoss JSF 指南中给出的建议来包装 Faces servlet,因为我找不到jsf-integration-deployer-jboss-beans.xml任何地方。

我也无法让Ed Burns 提出的方法发挥作用。javax.faces.context.ExceptionHandlerFactory我想原因是它针对 JSF2,因为我在我的罐子里找不到。

更糟糕的是,我对 JSF 还很陌生,所以我不得不依靠详细的指导,在寻找这些指导时,我找到了上述方法,但未能应用它们。

谢谢

4

2 回答 2

3

那篇文章确实是针对 JSF 2.x 的。JSF 1.x 没有任何异常处理工具。

只需抓住并重定向自己,而不是让容器去做。过滤器是一个明智的地方:

try {
    chain.doFilter(request, response);
} catch (ServletException e) {
    if (e.getRootCause() instanceof ViewExpiredException) {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        res.sendRedirect(req.getContextPath() + "/errors/session-expired.jsf");
    } else {
        throw e;
    }
}

将其映射web.xml到 的 servlet 名称FacesServlet以使其运行。

于 2011-11-10T16:00:59.783 回答
1

我在 JSF 2.0 中遇到了同样的问题,实现由 IBM Websphere 8.5.5.3 提供。

我尝试使用 ExceptionHandlerWrapper 检查 ViewExpiredException 并重定向到会话过期页面(或登录页面),但我无法消除以下错误,遗憾的是此错误在处理程序之前打印:

StateUtils E View State cannot be reconstructed

但是我设法通过实现一个 servlet 过滤器来解决它,该过滤器将检查任何潜在的 ViewExpiredException,如果有的话,它将重定向到会话过期页面。

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;

HttpSession session = request.getSession(false);

boolean requestContainsViewState = (request.getParameter("javax.faces.ViewState") != null);
boolean potentialViewExpiredException = (session == null && requestContainsViewState);
if (potentialViewExpiredException) {
    // No session found and potential ViewExpiredException, redirect to session expired page.
    response.sendRedirect(request.getContextPath() + "/pages/error/expired.xhtml");
} else {
    chain.doFilter(req, res);
}

编辑:您需要确保这是过滤器链中的第一个过滤器,如果有以前的过滤器并且此过滤器创建了一个会话,则上述解决方案将不适合您。

于 2018-07-21T14:43:59.083 回答