package org.hsweb.web.controller; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.hsweb.commons.StringUtils; import org.hsweb.web.bean.po.logger.LoggerInfo; import org.hsweb.web.bean.po.user.User; import org.hsweb.web.core.exception.BusinessException; import org.hsweb.web.core.logger.AccessLoggerPersisting; import org.hsweb.web.core.logger.Slf4jAccessLoggerPersisting; import org.hsweb.web.core.message.FastJsonHttpMessageConverter; import org.hsweb.web.core.message.ResponseMessage; import org.hsweb.web.core.utils.WebUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import javax.annotation.PostConstruct; import java.util.List; @Configuration @ConditionalOnProperty(name = "hsweb.access-logger", havingValue = "true") public class AopAccessLoggerResolverAutoConfiguration { @Bean public AopAccessLoggerResolverConfiguration aopAccessLoggerResolverConfiguration() { return new AopAccessLoggerResolverConfiguration(); } @Bean public Slf4jAccessLoggerPersisting slf4jAccessLoggerPersisting() { return new Slf4jAccessLoggerPersisting(); } @Aspect @Order(Ordered.HIGHEST_PRECEDENCE) static class AopAccessLoggerResolverConfiguration extends org.hsweb.web.core.logger.AopAccessLoggerResolver { @Autowired(required = false) private FastJsonHttpMessageConverter fastJsonHttpMessageConverter; @Autowired(required = false) private List<AccessLoggerPersisting> accessLoggerPersisting; @PostConstruct private void init() { if (fastJsonHttpMessageConverter == null) fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter(); } @Around(value = "execution(* org.hsweb.web..controller..*Controller..*(..))||@annotation(org.hsweb.web.core.logger.annotation.AccessLogger)") public Object around(ProceedingJoinPoint pjp) throws Throwable { LoggerInfo loggerInfo = resolver(pjp); long requestTime = System.currentTimeMillis(); Object result = null; try { result = pjp.proceed(); } catch (Throwable e) { if (!(e instanceof BusinessException)) { result = ResponseMessage.error(e.getMessage()); loggerInfo.setExceptionInfo(StringUtils.throwable2String(e)); } else { result = ResponseMessage.error(e.getMessage(), ((BusinessException) e).getStatus()); } throw e; } finally { long responseTime = System.currentTimeMillis(); User user = WebUtil.getLoginUser(); loggerInfo.setRequestTime(requestTime); loggerInfo.setResponseTime(responseTime); loggerInfo.setResponseContent(fastJsonHttpMessageConverter.converter(result)); if (user != null) loggerInfo.setUserId(user.getId()); if (result instanceof ResponseMessage) loggerInfo.setResponseCode(String.valueOf(((ResponseMessage) result).getCode())); if (accessLoggerPersisting != null) { accessLoggerPersisting.forEach(loggerPersisting -> loggerPersisting.save(loggerInfo)); } } return result; } } }