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.4 kB

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

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

Contributors (1)