我想知道在 asp.net 中是否有类似 Global.asax 的 Application_Error 但在 java 中
?我正在使用jersey和angularJS。我已经实现了我测试过的 ServletContextListener,它可以工作,但找不到类似 application_error
public class MyListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("Shutting down");
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("Starting");
}
}
我还有一个类,它实现了来自 ContainerRequestFilter 的方法过滤器,我在其中验证我的 jwt 令牌并接受或拒绝授权。
我所有的方法都不处理其中的异常,这意味着我想捕获整个应用程序的异常,即使它是在资源、服务层或数据访问层的方法等中生成的,并尝试发送电子邮件给管理员并重定向到 error.html 页面。
提前谢谢。
我认为有一些独立于Jersey
的解决方案,您可以实现这些解决方案来捕获Java Web应用程序中的所有异常。我假设您的项目web.xml
-
1(使用过滤器- 您可以在 Web 应用程序中添加一个filter
并捕获其中的所有异常。Filter
就像一个拦截器,可以在处理任何请求之前调用。
您可以在web.xml
中定义过滤器 -
<filter>
<filter-name>exceptionFilter</filter-name>
<filter-class>com.MyExceptionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>exceptionFilter</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
现在定义MyExceptionFilter
类 -
public final class MyExceptionFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) {
try {
// forward request to subsequent filter/resource/servlet
filterChain.doFilter(request, response);
} catch ( Throwable ex ) {
// do whatever you want in case any exception occurred and not caught in the request processing class
// forward request to error page
request.getRequestDispatcher("/ErrorPage.jsp").forward(request, response);
}
}
@Override
public void destroy() {
}
}
这种方法的问题在于可以在 Web 应用程序中定义多个过滤器。如何调用这些筛选器的顺序不是固定的。
2( 错误页 - 您还可以为 Web 应用程序定义错误页。在web.xml
,添加以下行 -
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/ExceptionHandler</location>
</error-page>
然后定义ExceptionHandler
servlet -
@WebServlet("/ExceptionHandler")
public class ExceptionHandler extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processException(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processException(request, response);
}
private void processException(HttpServletRequest request,
HttpServletResponse response) throws IOException {
Throwable throwable = (Throwable) request
.getAttribute("javax.servlet.error.exception");
// do whatever you want to do with exception
// forward request to error page
request.getRequestDispatcher("/ErrorPage.jsp").forward(request, response);
}
}