Spring AOP:实现Request信息获取
关键代码
ServletRequestAttributes attributes = (ServletRequestAttributes)
RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
RequestLogAop
@Aspect @Order(5) @Component public class RequestLogAop { private static final Logger LOGGER = LoggerFactory.getLogger(RequestLogAop.class); private ThreadLocal<RequestInfo> localInfo = new ThreadLocal<>(); @Pointcut("execution(public love.ning.yangxuyue.common.base.ResultBean *(..))") public void requestLogAop() { } @Before("requestLogAop()") public void outInfo(JoinPoint joinPoint) { // 接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); // 记录下请求内容 RequestInfo info = new RequestInfo(); info.setUrl(request.getRequestURI()); info.setIp(request.getRemoteAddr()); info.setClientPort(request.getRemotePort()); info.setServerPort(request.getServerPort()); info.setHttpMethod(request.getMethod()); info.setClassMethod(joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); info.setArgs(Arrays.toString(joinPoint.getArgs())); localInfo.set(info); System.out.println(info); } @AfterReturning(returning = "body", pointcut = "requestLogAop()") public void doAfterReturning(Object body) throws Throwable { RequestInfo info = localInfo.get(); info.setReturnMsg(body); // 处理RequestInfo System.out.println(info); // 删除ThreadLocal中的数据,以防内存泄露问题 localInfo.remove(); } //@AfterThrowing(pointcut = "webPointcut()", throwing = "e") //public void handleThrowing(Exception e) { // e.printStackTrace(); // logger.error("发现异常!" + e.getMessage()); //logger.error(JSON.toJSONString(e.getStackTrace())); // //这里输入友好性信息 // writeContent("出现异常"); // }
切面的处理顺序问题。
@Order(i)注解来标识切面的优先级。i的值越小,优先级越高。
例如:一个切面为@Order(10),而上文中另一个切面为@Order(5)
在@Before中优先执行@Order(5)的内容,再执行@Order(10)的内容
在@After和@AfterReturning中优先执行@Order(10)的内容,再执行@Order(5)的内容
总结:
在切入点前的操作,按order的值由小到大执行
在切入点后的操作,按order的值由大到小执行