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的值由大到小执行

猜你喜欢

转载自www.cnblogs.com/yang21/p/9959578.html
今日推荐