我一直在想,当特定的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>
但我想要的是,我想发送电子邮件或记录此特定错误的发生。我在之前的问题中被告知过 我的控制器层次结构无法处理这种类型的错误。
有什么想法吗?
答案 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,您已经知道该问题与找不到的页面有关。
冷却。