Учитывая изменения в журнале, которые были выполнены в https: // github. com / spring-projects / spring-security-oauth / issues / 1271 и https://github.com/spring-projects/spring-security-oauth/issues/1290, я думаю, может быть трудно угодить всем ведением журнала, которое присутствует в конечной точке токена. Например, я хотел бы поймать все, что относится к простому @ExceptionHandler(Exception.class)
, как сообщение об ошибке с журналом с трассировкой стека.
Как лучше всего перехватить исключения, возникающие в конечной точке ошибки, чтобы можно было применить настраиваемое ведение журнала?
2 ответа
Мы решили это решить с помощью spring-aop
. Мы просто перехватили правильные места и при этом записали сообщение об ошибке:
@Slf4j
@Aspect
@Component
public class OAuthErrorLoggingAspect {
private static final String ERROR_MESSAGE = "Error during token generation: ";
@Before("execution("
+ "public * "
+ "org.springframework.security.oauth2.provider.endpoint"
+ ".TokenEndpoint.handleException(Exception)) && args(ex))")
public void handleExceptionLogging(Exception ex) {
if (ex instanceof ClientAbortException) {
log.debug(ERROR_MESSAGE, ex);
} else {
log.error(ERROR_MESSAGE, ex);
}
}
@Before("execution("
+ "public * "
+ "org.springframework.security.oauth2.provider.endpoint"
+ ".TokenEndpoint.handleHttpRequestMethodNotSupportedException("
+ "org.springframework.web.HttpRequestMethodNotSupportedException)) && args(ex))")
public void handleHttpRequestMethodNotSupportedLogging(HttpRequestMethodNotSupportedException ex) {
log.debug(ERROR_MESSAGE, ex);
}
@Before("execution("
+ "public * "
+ "org.springframework.security.oauth2.provider.endpoint"
+ ".TokenEndpoint.handleClientRegistrationException("
+ "Exception)) && args(ex))")
public void handleClientRegistrationErrorLogging(Exception ex) {
log.debug(ERROR_MESSAGE, ex);
}
@Before("execution("
+ "public * "
+ "org.springframework.security.oauth2.provider.endpoint"
+ ".TokenEndpoint.handleException("
+ "org.springframework.security.oauth2.common.exceptions.OAuth2Exception)) && args(ex))")
public void handleOAuth2ExceptionLogging(OAuth2Exception ex) {
log.debug(ERROR_MESSAGE, ex);
}
}
Мы можем использовать переопределить обработчик исключений HandlerExceptionResolverComposite
, определенный в WebMvcConfigurationSupport
. Это объединит все преобразователи исключений в один преобразователь исключений. Затем мы можем определить ваши собственные преобразователи исключений.
Один из преобразователей исключений, который мы можем использовать, - это ExceptionHandlerExceptionResolver
, это позволит обрабатывать исключения на основе АОП, включая классы с аннотацией @ControllerAdvice
.
В нашем пользовательском совете по контроллеру мы можем использовать обработчик для разных исключений:
@ExceptionHandler({OAuth2Exception.class})
public ResponseEntity<Object> handleOAuth2Exception(final OAuth2Exception exception, final WebRequest request) {
LOGGER.debug("OAuth failed on request processing", exception);
Похожие вопросы
Новые вопросы
spring
Spring Framework - это среда с открытым исходным кодом для разработки приложений на платформе Java. В ее основе лежит широкая поддержка компонентно-ориентированных архитектур, и в настоящее время в ней имеется более двадцати высокоинтегрированных модулей.