这里我在url里面的参数,aop的webLogAspect类也没有获取到啊?

这里我在url里面的参数,aop的webLogAspect类也没有获取到啊?

package com.imooc.mall.filter;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.util.Arrays;

/**
 * 描述: 打印请求和响应信息
 */
@Aspect
@Component
public class WebLogAspect {

    private final Logger log = LoggerFactory.getLogger(WebLogAspect.class);

    // 拦截点
    @Pointcut("execution(public * com.imooc.mall.controller.*.*(..))")
    public void webLog(){

    }

    // 请求信息
    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint){
        ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        log.info("URL:" + request.getRequestURL().toString());
        log.info("HTTP_METHOD:" + request.getMethod());
        log.info("IP:" + request.getRemoteAddr());
        log.info("CLASS_METHOD:"+joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
        log.info("ARGS:" + Arrays.toString(joinPoint.getArgs()));
    }

    // 响应信息
    @AfterReturning(returning = "res",pointcut = "webLog()")
    public void doReturning(Object res) throws JsonProcessingException {
        log.info("RESPONSE:" + new ObjectMapper().writeValueAsString(res));
    }
}



https://img1.sycdn.imooc.com//climg/64f92f790943984323941402.jpg

https://img1.sycdn.imooc.com//climg/64f92f7a09f462ed23941402.jpg


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小蓝 2023-09-07 11:10:21

同学你好,从同学的截图中看到,参数id实际上是已经获取到了的。

同学的疑问是否在日志中URL字段中,只有“http://localhost:8080/getUser”而没有拼接的“id=1”?

在请求中,URL的定义是统一资源定位系统(uniform resource locator;URL)是因特网的万维网服务程序上用于指定信息位置的表示方法。而这个定位中是不包含参数的,只不过在GET请求时,将参数拼接在URL的后面了。虽然拼接了,但不代表参数就是URL的一部分了。所以在解析的时候,URL和参数是单独解析的,也就是日志中只有URL,而参数单独存储在id中了。

祝学习愉快~

  • 提问者 AbelZephyr #1
    WebLogAspect.java 文件
    
    log.info("ARGS:" + Arrays.toString(joinPoint.getArgs()));

     那这个代码可以获取到什么参数?

    2023-09-08 08:02:21
  • 好帮手慕小蓝 回复 提问者 AbelZephyr #2

    同学你好,getArgs()方法获取的是被加入切点的外部方法的参数列表中所有参数的值。例如在一个方法声明为“public void method(String s,int i)”的方法中使用AOP,那么getArgs()方法就会获取到(String s,int i)这个参数列表的值。例如调用method时,传入了“("imooc",2023)”,此时getArgs()方法获取到一个Object类型数组,里面就存储了这两个值。另外,该方法获取的值,与参数列表的顺序是完全一致的。

    祝学习愉快~

    2023-09-08 09:20:16
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java工程师 2024版
  • 参与学习       2020    人
  • 提交作业       1249    份
  • 解答问题       1202    个

2024重磅革新,超百小时内容豪华升级,加速提升高级技能与高薪就业竞争力 课程紧贴企业最新人才需求,历经7年持续迭代,帮助万名学子入行转行 从零起点到高阶实战,学习路径稳健顺滑,成就从小白到工程师高薪

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师