Это, кажется, простой вопрос, но мы не могли найти его нигде в Интернете.
Мы используем 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-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();
Я не уверен, что это хорошая практика... но она должна работать.
Надеюсь это поможет!!
Это лишь частичный ответ; он решает проблему, но не использует весеннюю безопасность.
Создайте фильтр, который проверяет статус в ответе (response.getStatus()). Если код состояния - это тот, который вам нужен (например, 404 или HttpServletResponse.SC_NOT_FOUND), запишите сообщение с информацией из запроса, который вы хотите сохранить.
Начиная с 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);
}
}
spring.mvc.throw-exception-if-no-handler-found=true
. Вы также можете отключить исходное предупреждение, добавив свойство logging.level.org.springframework.web.servlet.PageNotFound=ERROR