在404和500 Http Error Spring MVC上发送电子邮件或记录错误

时间:2010-09-28 01:36:14

标签: java spring tomcat servlets spring-mvc

我一直在想,当特定的HTTP错误代码发生时,我怎么可能发送电子邮件 在我的Spring MVC Web应用程序中。     请看一下我的web.xml配置。它工作正常,并将我重定向到特定的错误页面。

<web-app ...>
  <servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>*.htm</url-pattern>
  </servlet-mapping>

  <error-page>
    <error-code>404</error-code>
    <location>/WEB-INF/pages/404.jsp</location>
  </error-page>

  <error-page>
    <error-code>500</error-code>
    <location>/WEB-INF/pages/500.jsp</location>
  </error-page>

</web-app>

但我想要的是,我想发送电子邮件或记录此特定错误的发生。我在之前的问题中被告知过 我的控制器层次结构无法处理这种类型的错误。

有什么想法吗?

4 个答案:

答案 0 :(得分:3)

出于某种原因,我做了类似的事情。它适用于我的情况。你能评论我做了什么吗? 在我的web.xml中,我编辑了我的位置标记以将其转发给我的控制器。

 <!-- Error Pages -->
    <error-page>
        <error-code>404</error-code>
        <location>/errorEncountered.htm</location>
    </error-page>

    <error-page>
        <error-code>500</error-code>
        <location>/errorEncountered.htm</location>
    </error-page>

在我的控制器中,这是我发送电子邮件的地方。

@Controller
@RequestMapping("/errorEncountered.htm")
public class ErrorHandlerController {
    private MailService mailService;

    @RequestMapping(method = RequestMethod.GET)
    public String handleGet(HttpServletRequest request) {
            // The Servlet spec guarantees this attribute will be available
            Throwable exception = (Throwable) request
                    .getAttribute("javax.servlet.error.exception");

            .
            .
            .
            mailService.sendMail();
        }
    }
}

有任何批评吗?

答案 1 :(得分:1)

对于4nn(客户端)错误,最好的办法是在servletcontainer级别配置访问日志。对于Tomcat,您可以使用 Valve 来实现此目的。它或多或少是一种Filter,它在servletcontainer级而不是webapp级别插入。您可以在Apache Tomcat Configuration Reference中找到更多详细信息。您需要打开并配置Access Log Valve。这只会写入日志文件,但您可以只扩展org.apache.catalina.valves.AccessLogValve并添加一些代码,以便404发送邮件。要让它运行,只需将该类放在Tomcat的类路径中,并在 Valve 配置中将其指定为className

对于5nn(服务器端)错误,您可以在Filter的{​​{1}}上创建url-pattern/*基本上执行doFilter()方法

try {
    chain.doFilter(request, response);
}
catch (ServletException | IOException e) {
    mail(e);
    throw e;
}

答案 2 :(得分:0)

在Http错误代码上发送电子邮件可能为时已晚,无法找到错误发生的原因。为我们做的更好的事情是发送关于异常的电子邮件。我们可能不希望为每个例外都这样做,因为这将是压倒性的。

为此,我们扩展SimpleMappingExceptionResolver。然后需要使用上下文初始化此解析器。

MyExceptionResolver extends SimpleMappingExceptionResolver
{
    @Autowire
    MailService mailService;

    protected ModelAndView getModelAndView(String viewName, Exception ex, HttpServletRequest request)
    {
       //Depending on exception resolve to view name, either 404 or server crash report

       //Also send emails for specific exception types.
    } 
}

 Spring wiring:
 <bean class="x.y.z.MyExceptionResolver"/>

此外,我们可以使用方面进行异常处理。您可以查看方面文档。

答案 3 :(得分:0)

使用web.xml时,Spring不会排在首位(也取决于您的<url-pattern>)。

您可以做的是编写一个扩展HTTPServlet的自定义servlet。

在该servlet中,您可以使用从doGet()覆盖的HttpServlet方法编写用于发送电子邮件的代码。

编辑您的web.xml <url-pattern>以在发生错误时转到该servlet。

如果是错误代码404,您已经知道该问题与找不到的页面有关。

冷却。