Spring Security: как перехватить PageNotFound

1

Это, кажется, простой вопрос, но мы не могли найти его нигде в Интернете.

Мы используем Spring Security 3.2 и хотим иметь возможность печатать IP-адрес удаленного хоста всякий раз, когда мы получаем сообщение весны:

WARN  [org.springframework.web.servlet.PageNotFound] - No mapping found for HTTP request with URI [/page.bla] in DispatcherServlet with name 'XXX'.

Как мы можем это сделать?

Теги:
spring
spring-mvc
security

3 ответа

1
Лучший ответ

Ваша проблема не связана с spring-security. Это сообщение журнала создается в классе DispatcherServlet.

Вы можете расширить org.springframework.web.servlet.DispatcherServlet и переопределить protected void noHandlerFound(HttpServletRequest request, HttpServletResponse response) throws Exception Метод protected void noHandlerFound(HttpServletRequest request, HttpServletResponse response) throws Exception:

protected void noHandlerFound(HttpServletRequest request, HttpServletResponse response) throws Exception {
    if (pageNotFoundLogger.isWarnEnabled()) {
        String requestUri = urlPathHelper.getRequestUri(request);
        pageNotFoundLogger.warn("No mapping found for HTTP request with URI [" + requestUri +"] in DispatcherServlet with name '" + getServletName() + "'");
    }
    response.sendError(HttpServletResponse.SC_NOT_FOUND);
}

Таким образом вы можете настроить сообщение регистрации и добавить к нему IP-адрес из параметра HttpServletRequest:

request.getRemoteAddr();

Я не уверен, что это хорошая практика... но она должна работать.

Надеюсь это поможет!!

  • 0
    Работал как шарм! Только одно незначительное изменение: «urlPathHelper» не виден внутри класса. Просто изменил его на «request.getServletPath ()» и проблема исчезла. Спасибо!
  • 0
    Я думаю, что это не должно быть проблемой. Он используется только для целей регистрации.
1

Это лишь частичный ответ; он решает проблему, но не использует весеннюю безопасность.

Создайте фильтр, который проверяет статус в ответе (response.getStatus()). Если код состояния - это тот, который вам нужен (например, 404 или HttpServletResponse.SC_NOT_FOUND), запишите сообщение с информацией из запроса, который вы хотите сохранить.

  • 0
    Что ж, при этом мы получим две строки журнала. Мы действительно хотели бы перехватить тот, который появляется из PageNotFound. В любом случае, если в ближайшие два дня здесь не появится подходящий ответ, я отмечу ваш как правильный ответ.
0

Начиная с Spring 4.0, если вы используете @ControllerAdvice, вы также можете включить тот факт, что Spring NoHandlerFoundException когда обнаруживает PageNotFound, настраивая DispatcherServlet:

@Configuration
public class ApplicationConfiguration {

    @Autowired
    void configureDispatcherServlet( DispatcherServlet dispatcherServlet ) {
        dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
    }
}

Затем в вашем @ControllerAdvice вы сможете обработать это исключение для возврата пользовательских данных:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler
    ResponseEntity<MyCustomError> handle(NoHandlerFoundException e) {

        return new ResponseEntity<>(new MyCustomError(), HttpStatus.NOT_FOUND);
    }
}
  • 0
    Я думаю, что это самый простой ответ. Это также можно сделать с помощью свойства spring.mvc.throw-exception-if-no-handler-found=true . Вы также можете отключить исходное предупреждение, добавив свойство logging.level.org.springframework.web.servlet.PageNotFound=ERROR

Ещё вопросы

Сообщество Overcoder
Наверх
Меню