1.引入依赖
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.8</version>
</dependency>
2.自定义一个注解
package com.example.springbootdemo3.annotation;import java.lang.annotation.*;@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyLog {String name() default "";
}
3.自定义AOP
package com.example.springbootdemo3.aop;import com.example.springbootdemo3.annotation.MyLog;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
@Component
@Aspect
public class MyControllerAop {@Pointcut("@annotation(com.example.springbootdemo3.annotation.MyLog)")private void pointCut() {}@Around("pointCut()") public Object around(ProceedingJoinPoint joinPoint) throws Throwable {MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();Method method = methodSignature.getMethod();if (method != null) {MyLog myLog = method.getAnnotation(MyLog.class);System.out.println("MyLog name:" + myLog.name());}String name = method.getName();System.out.println("方法名:" + name);ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = servletRequestAttributes.getRequest();String url = request.getRequestURL().toString();System.out.println("访问url:" + url);String method1 = request.getMethod();System.out.println("请求方式:" + method1);String queryString = request.getQueryString();System.out.println("请求参数:" + queryString);System.out.println("请求IP:" + getClientIpAddress(request));Object proceed = joinPoint.proceed();System.out.println("返回值:" + proceed);return proceed;}private String getClientIpAddress(HttpServletRequest request) {String ip = request.getHeader("X-Forwarded-For");if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("HTTP_CLIENT_IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("HTTP_X_FORWARDED_FOR");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();}return ip;}
}
3.写个测试Controller试一下
package com.example.springbootdemo3.config;import com.example.springbootdemo3.annotation.MyLog;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Map;
@RestController
@RequestMapping("/aop-test")
public class AopTestController {@PostMapping("/test")@MyLog(name = "aop测试")public String aopTest(@RequestBody Map map) {System.out.println(map);return "success";}
}
4.结束
