spring如何配置aop(springboot如何使用aop切面记录)

如何使用 aop 切面对请求进行日志记录,并且记录 UserAgent 信息。

spring如何配置aop(springboot如何使用aop切面记录)(1)

pom.xml

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>spring-boot-demo-log-aop</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>jar</packaging> <name>spring-boot-demo-log-aop</name> <description>Demo project for Spring Boot</description> <parent> <groupId>com.xkcoding</groupId> <artifactId>spring-boot-demo</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> </dependency> <!-- 解析 UserAgent 信息 --> <dependency> <groupId>eu.bitwalker</groupId> <artifactId>UserAgentUtils</artifactId> </dependency> </dependencies> <build> <finalName>spring-boot-demo-log-aop</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

AopLog.java

/** * <p> * 使用 aop 切面记录请求日志信息 * </p> * * @package: com.xkcoding.log.aop.aspectj * @description: 使用 aop 切面记录请求日志信息 * @author: yangkai.shen * @version: V1.0 * @modified: yangkai.shen */ @Aspect @Component @Slf4j public class AopLog { private static final String START_TIME = "request-start"; /** * 切入点 */ @Pointcut("execution(public * com.xkcoding.log.aop.Controller.*Controller.*(..))") public void log() { } /** * 前置操作 * * @param point 切入点 */ @Before("log()") public void beforeLog(JoinPoint point) { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = Objects.requireNonNull(attributes).getRequest(); log.info("【请求 URL】:{}", request.getRequestURL()); log.info("【请求 IP】:{}", request.getRemoteAddr()); log.info("【请求类名】:{},【请求方法名】:{}", point.getSignature().getDeclaringTypeName(), point.getSignature().getName()); Map<String, String[]> parameterMap = request.getParameterMap(); log.info("【请求参数】:{},", JSONUtil.toJsonStr(parameterMap)); Long start = System.currentTimeMillis(); request.setAttribute(START_TIME, start); } /** * 环绕操作 * * @param point 切入点 * @return 原方法返回值 * @throws Throwable 异常信息 */ @Around("log()") public Object aroundLog(ProceedingJoinPoint point) throws Throwable { Object result = point.proceed(); log.info("【返回值】:{}", JSONUtil.toJsonStr(result)); return result; } /** * 后置操作 */ @AfterReturning("log()") public void afterReturning() { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = Objects.requireNonNull(attributes).getRequest(); Long start = (Long) request.getAttribute(START_TIME); Long end = System.currentTimeMillis(); log.info("【请求耗时】:{}毫秒", end - start); String header = request.getHeader("User-Agent"); UserAgent userAgent = UserAgent.parseUserAgentString(header); log.info("【浏览器类型】:{},【操作系统】:{},【原始User-Agent】:{}", userAgent.getBrowser().toString(), userAgent.getOperatingSystem().toString(), header); } }

TestController.java

/** * <p> * 测试 Controller * </p> * * @package: com.xkcoding.log.aop.controller * @description: 测试 Controller * @author: yangkai.shen * @version: V1.0 * @modified: yangkai.shen */ @RestController public class TestController { /** * 测试方法 * * @param who 测试参数 * @return {@link Dict} */ @GetMapping("/test") public Dict test(String who) { return Dict.create().set("who", StrUtil.isBlank(who) ? "me" : who); } }

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页