【发布时间】:2014-03-05 19:41:11
【问题描述】:
我不确定这里是否已经问过这个问题,我能找到的最好的重复是Servlet Filter url-mapping /* is not working on 404 errors
但这并不能解决我的问题。
我正在使用 Jetty 9,我有一个类似这样的过滤器 -
@WebFilter(dispatcherTypes = { DispatcherType.REQUEST, DispatcherType.ERROR }, urlPatterns = { "/*" })
public class ErrorHandler implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
int errorcode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
String message = "";
boolean error = false;
StringWriter sw_stacktrace = new StringWriter();
PrintWriter pw_stacktrace = new PrintWriter(sw_stacktrace);
try {
chain.doFilter(request, response);
} catch (AppException e) {
errorcode = e.getCode();
error = true;
message = e.getMessage();
e.printStackTrace(pw_stacktrace);
} catch (Throwable t) {
error = true;
message = "Unknown Error";
t.printStackTrace(pw_stacktrace);
}
if (!response.isCommitted()) {
if (error) {
if (errorcode == HttpServletResponse.SC_INTERNAL_SERVER_ERROR) {
String log = String.format("Error %d Occurred - \n %s \n Stack Trace - \n %s", errorcode, message, sw_stacktrace.toString());
request.getServletContext().log(log);
}
HttpServletResponse resp = (HttpServletResponse) response;
resp.setStatus(errorcode);
request.setAttribute("errorMessage", message);
} else {
request.setAttribute("errorMessage", request.getAttribute("javax.servlet.error.message"));
}
request.getRequestDispatcher("/WEB-INF/templates/error/" + errorcode + ".jsp").forward(request, response);
}
pw_stacktrace.close();
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
我使用它来捕获自定义异常类型(ServletException 的子类)和运行时发生的任何其他异常(空指针等)以显示错误页面——它运行良好。
但由于某种原因,我的过滤器没有被调用 404。
如我链接的问题中所述,我也尝试了web.xml 方法,但这也不起作用。
我是 Java 和所有这些东西的新手。我可能在这里尝试了错误的事情,但是如果过滤器不应该捕获各种错误,那么 DispatcherType.ERROR 到底有什么用?我知道可以按照http://www.eclipse.org/jetty/documentation/current/custom-error-pages.html 中的描述配置自定义错误页面
只是好奇这件事。
【问题讨论】:
标签: java servlets jetty servlet-filters