ViewExpiredException
正在通过重定向到登录屏幕来处理。问题是仍然记录了异常,并且客户非常希望server.log
无异常。
虽然在这种情况下可能是一个值得怀疑的要求,但我仍然要做到这一点。我们使用Mojarra并在JBoss EAP 5.1上部署
MyFaces approach无效,因为我显然无法使用Mojarra包裹MyFacesServlet
我无法应用JBoss JSF guide中给出的建议来包装Faces servlet,因为我无法在任何地方找到jsf-integration-deployer-jboss-beans.xml
。
我也无法让approach proposed by Ed Burns工作。我想原因是它针对的是JSF2因为我在我的罐子里找不到javax.faces.context.ExceptionHandlerFactory
。
更糟糕的是,我对JSF很陌生,所以我必须依赖详细的指导,寻找我已经找到上述方法但未能应用它们。
谢谢
答案 0 :(得分: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
映射到FacesServlet
的servlet名称上以使其运行。
答案 1 :(得分: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);
}
编辑:您需要确保这是过滤器链中的第一个过滤器,如果有以前的过滤器并且此过滤器创建了会话,则上述解决方案将对您不起作用。