Отправить электронную почту или зарегистрированную ошибку на 404 и 500 Http Error Spring MVC - PullRequest
1 голос
/ 28 сентября 2010

Я думал, как я могу отправить электронное письмо, когда происходит определенный код ошибки HTTP в моем веб-приложении Spring MVC. Пожалуйста, посмотрите на мою конфигурацию 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 ]

3 голосов
/ 04 октября 2010

По какой-то причине я сделал что-то подобное.Это работает как для моего случая.Можете ли вы прокомментировать, что я сделал?В моем файле 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>

В моем контроллере я отправляю электронное письмо.

1 голос
/ 28 сентября 2010

Для ошибок 4nn (на стороне клиента) лучше всего настроить журналы доступа на уровне servletcontainer. В случае с Tomcat вы можете сделать это с ароматом Valve . Это более или менее своего рода Filter, который должен быть подключен на уровне контейнера сервлетов, а не на уровне веб-приложений. Вы можете найти более подробную информацию в Справочник по настройке Apache Tomcat . Вам нужно будет включить и настроить Access Log Valve . Это будет записывать только в лог-файл, но вы можете просто расширить org.apache.catalina.valves.AccessLogValve и добавить некоторый код, который отправляет письмо в случае 404. Чтобы запустить его, просто поместите этот класс в путь к классам Tomcat и укажите его как className в Valve конфигурации.

Для ошибок 5nn (на стороне сервера) вы можете создать и поместить Filter в url-pattern из /*, что в основном делает в методе doFilter() следующее.

try {
    chain.doFilter(request, response);
}
catch (ServletException | IOException e) {
    mail(e);
    throw e;
}
0 голосов
/ 30 сентября 2010

При использовании web.xml Spring не будет первым в очереди на запрос (также в зависимости от ваших <url-pattern> s).

Что вы можете сделать, это написать собственный сервлет, который расширяет HTTPServlet.

В этом сервлете вы можете написать код для отправки электронного письма в методе doGet(), который вы переопределили с HttpServlet.

Отредактируйте web.xml <url-pattern>, чтобы перейти к сервлету при возникновении ошибки.

Если код ошибки 404, вы уже знаете, что проблема связана с не найденной страницей.

Cool.

0 голосов
/ 28 сентября 2010

Отправка электронной почты по Http Error Code может быть слишком запоздалой в процессе, чтобы определить причину ошибкиЛучшей вещью для нас была отправка писем об исключениях.Возможно, мы не захотим делать это для каждого исключения, поскольку это было бы ошеломляющим.

Для этого мы расширяем SimpleMappingExceptionResolver.Затем этот Resolver должен быть инициализирован с контекстом.

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"/>

Также мы можем выполнять обработку исключений с аспектами.Вы можете посмотреть документацию по аспектам для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...