我不确定这里是否已经提出过这个问题,我能找到的最好的重复是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
的子类)以及在运行时发生的任何其他异常(空指针等)以显示错误页面 - 它工作正常。< / p>
但由于某种原因,我的过滤器不会被调用404s。
我也尝试了web.xml
方法,如我所链接的问题所述,但这也不起作用。
我是Java的新手以及所有这些东西......我可能在这里尝试了错误的东西,但如果过滤器不应该捕获各种错误,那么DispatcherType.ERROR
的用途到底是什么?我知道可以按照http://www.eclipse.org/jetty/documentation/current/custom-error-pages.html
答案 0 :(得分:0)
所以,问题是,404并不是一个例外。当我在DispatcherType.ERROR
中设置<error-page>
时,会调用标有web.xml
的过滤器。