You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

README.md 5.1 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. # spring-boot-demo-log-aop
  2. > 此 demo 主要是演示如何使用 aop 切面对请求进行日志记录,并且记录 UserAgent 信息。
  3. ## pom.xml
  4. ```xml
  5. <?xml version="1.0" encoding="UTF-8"?>
  6. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  7. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  8. <modelVersion>4.0.0</modelVersion>
  9. <artifactId>spring-boot-demo-log-aop</artifactId>
  10. <version>1.0.0-SNAPSHOT</version>
  11. <packaging>jar</packaging>
  12. <name>spring-boot-demo-log-aop</name>
  13. <description>Demo project for Spring Boot</description>
  14. <parent>
  15. <groupId>com.xkcoding</groupId>
  16. <artifactId>spring-boot-demo</artifactId>
  17. <version>1.0.0-SNAPSHOT</version>
  18. </parent>
  19. <properties>
  20. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  21. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  22. <java.version>1.8</java.version>
  23. </properties>
  24. <dependencies>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-web</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-aop</artifactId>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-starter-test</artifactId>
  36. <scope>test</scope>
  37. </dependency>
  38. <dependency>
  39. <groupId>org.projectlombok</groupId>
  40. <artifactId>lombok</artifactId>
  41. <optional>true</optional>
  42. </dependency>
  43. <dependency>
  44. <groupId>cn.hutool</groupId>
  45. <artifactId>hutool-all</artifactId>
  46. </dependency>
  47. <!-- 解析 UserAgent 信息 -->
  48. <dependency>
  49. <groupId>eu.bitwalker</groupId>
  50. <artifactId>UserAgentUtils</artifactId>
  51. </dependency>
  52. </dependencies>
  53. <build>
  54. <finalName>spring-boot-demo-log-aop</finalName>
  55. <plugins>
  56. <plugin>
  57. <groupId>org.springframework.boot</groupId>
  58. <artifactId>spring-boot-maven-plugin</artifactId>
  59. </plugin>
  60. </plugins>
  61. </build>
  62. </project>
  63. ```
  64. ## AopLog.java
  65. ```java
  66. /**
  67. * <p>
  68. * 使用 aop 切面记录请求日志信息
  69. * </p>
  70. *
  71. * @package: com.xkcoding.log.aop.aspectj
  72. * @description: 使用 aop 切面记录请求日志信息
  73. * @author: yangkai.shen
  74. * @date: Created in 2018/10/1 10:05 PM
  75. * @copyright: Copyright (c) 2018
  76. * @version: V1.0
  77. * @modified: yangkai.shen
  78. */
  79. @Aspect
  80. @Component
  81. @Slf4j
  82. public class AopLog {
  83. private static final String START_TIME = "request-start";
  84. /**
  85. * 切入点
  86. */
  87. @Pointcut("execution(public * com.xkcoding.log.aop.controller.*Controller.*(..))")
  88. public void log() {
  89. }
  90. /**
  91. * 前置操作
  92. *
  93. * @param point 切入点
  94. */
  95. @Before("log()")
  96. public void beforeLog(JoinPoint point) {
  97. ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  98. HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
  99. log.info("【请求 URL】:{}", request.getRequestURL());
  100. log.info("【请求 IP】:{}", request.getRemoteAddr());
  101. log.info("【请求类名】:{},【请求方法名】:{}", point.getSignature().getDeclaringTypeName(), point.getSignature().getName());
  102. Map<String, String[]> parameterMap = request.getParameterMap();
  103. log.info("【请求参数】:{},", JSONUtil.toJsonStr(parameterMap));
  104. Long start = System.currentTimeMillis();
  105. request.setAttribute(START_TIME, start);
  106. }
  107. /**
  108. * 环绕操作
  109. *
  110. * @param point 切入点
  111. * @return 原方法返回值
  112. * @throws Throwable 异常信息
  113. */
  114. @Around("log()")
  115. public Object aroundLog(ProceedingJoinPoint point) throws Throwable {
  116. Object result = point.proceed();
  117. log.info("【返回值】:{}", JSONUtil.toJsonStr(result));
  118. return result;
  119. }
  120. /**
  121. * 后置操作
  122. */
  123. @AfterReturning("log()")
  124. public void afterReturning() {
  125. ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  126. HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
  127. Long start = (Long) request.getAttribute(START_TIME);
  128. Long end = System.currentTimeMillis();
  129. log.info("【请求耗时】:{}毫秒", end - start);
  130. String header = request.getHeader("User-Agent");
  131. UserAgent userAgent = UserAgent.parseUserAgentString(header);
  132. log.info("【浏览器类型】:{},【操作系统】:{},【原始User-Agent】:{}", userAgent.getBrowser().toString(), userAgent.getOperatingSystem().toString(), header);
  133. }
  134. }
  135. ```
  136. ## TestController.java
  137. ```java
  138. /**
  139. * <p>
  140. * 测试 Controller
  141. * </p>
  142. *
  143. * @package: com.xkcoding.log.aop.controller
  144. * @description: 测试 Controller
  145. * @author: yangkai.shen
  146. * @date: Created in 2018/10/1 10:10 PM
  147. * @copyright: Copyright (c) 2018
  148. * @version: V1.0
  149. * @modified: yangkai.shen
  150. */
  151. @RestController
  152. public class TestController {
  153. /**
  154. * 测试方法
  155. *
  156. * @param who 测试参数
  157. * @return {@link Dict}
  158. */
  159. @GetMapping("/test")
  160. public Dict test(String who) {
  161. return Dict.create().set("who", StrUtil.isBlank(who) ? "me" : who);
  162. }
  163. }
  164. ```

一个用来深度学习并实战 spring boot 的项目,目前总共包含 66 个集成demo,已经完成 55 个。