spring 环绕通知如何获取请求url

fiy 其他 156

回复

共3条回复 我来回复
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring的环绕通知可以通过JoinPoint对象获取请求的URL。JoinPoint是Spring AOP框架提供的一个接口,它表示正在执行的连接点,可以获取连接点的信息。

    要获取请求的URL,首先需要在环绕通知方法的参数列表中声明JoinPoint对象,并利用它来获取ServletRequest对象。然后通过ServletRequest对象的getRequestURL()方法获取请求的URL。

    下面是一个示例代码:

    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.ProceedingJoinPoint;
    import org.springframework.stereotype.Component;
    
    import javax.servlet.http.HttpServletRequest;
    
    @Aspect
    @Component
    public class MyAspect {
        
        @Around("execution(* com.example.controller.*.*(..))")
        public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {
            // 获取HttpServletRequest对象
            HttpServletRequest request = getRequest(joinPoint);
            
            // 获取请求的URL
            String url = request.getRequestURL().toString();
            
            // 继续执行目标方法
            Object result = joinPoint.proceed();
            
            return result;
        }
        
        private HttpServletRequest getRequest(JoinPoint joinPoint) {
            Object[] args = joinPoint.getArgs();
            for (Object arg : args) {
                if (arg instanceof HttpServletRequest) {
                    return (HttpServletRequest) arg;
                }
            }
            throw new IllegalArgumentException("No HttpServletRequest found in method parameters");
        }
    }
    

    在上面的示例代码中,使用@Around注解标注了一个环绕通知方法aroundMethod,并通过execution()指定了切点表达式,这里以com.example.controller包下的所有方法作为切点。在环绕通知方法中,首先通过getRequest()方法获取到HttpServletRequest对象,然后通过调用getRequestURL()方法获取请求的URL。

    请注意,上述示例是一个简化的示例,实际应用中可能需要根据具体情况进行调整。另外,还可以通过其他方式获取请求的URL,例如在Controller层中通过HttpServletRequest对象的方式获取,这取决于实际需求。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    在Spring中,环绕通知是一种通知类型,它能够在目标方法执行之前和之后执行自定义的代码,并且还可以控制目标方法的执行。要获取请求的URL,可以通过实现ProceedingJoinPoint接口来获取相关信息。下面是获取请求URL的步骤:

    1. 首先,创建一个环绕通知的方法,并在方法上使用@Around注解。
    2. 在环绕通知方法中将方法参数声明为ProceedingJoinPoint类型,以便获取目标方法的相关信息。
    3. 使用getRequest()方法获取HttpServletRequest对象。
    4. 调用getRequestURI()方法获取请求的URI。
    5. 如果需要获取完整的请求URL,可以使用getRequestURL()方法。
    6. 根据需要在环绕通知中使用这些信息。

    下面是一个示例代码展示了如何通过环绕通知获取请求URL:

    @Aspect
    @Component
    public class LoggingAspect {
    
        @Around("@annotation(Loggable)")
        public Object logMethodExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
            String url = request.getRequestURI();
            // 如果需要完整的URL,可以使用下面的代码
            // String fullUrl = request.getRequestURL().toString();
            
            // 在这里可以使用url进行其他操作
            System.out.println("Request URL: " + url);
            
            // 执行目标方法
            Object result = joinPoint.proceed();
            
            // 在这里可以对返回结果进行其他操作
            System.out.println("Response: " + result);
            
            return result;
        }
    }
    

    在上面的示例中,@Around("@annotation(Loggable)")注解用于指定应该在哪些方法上应用这个环绕通知。ProceedingJoinPoint参数用于获取目标方法的相关信息。通过RequestContextHolder.currentRequestAttributes()方法来获取当前请求的ServletRequestAttributes对象,进而获取HttpServletRequest对象。然后使用getRequestURI()方法获取请求的URI,并打印出来。在执行完目标方法后,可以对返回结果进行其他操作。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    在Spring AOP中,环绕通知(Around Advice)是一种在目标方法执行前后进行拦截,并能够控制目标方法是否继续执行的通知类型。通过环绕通知,我们可以获取请求的URL。

    要获取请求URL,我们可以借助Spring提供的HttpServletRequest对象。HttpServletRequest对象提供了一系列方法来获取请求的相关信息,包括URL、方法类型、请求头等。

    下面是一个示例代码,演示如何通过环绕通知获取请求的URL:

    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.springframework.stereotype.Component;
    
    import javax.servlet.http.HttpServletRequest;
    
    @Aspect
    @Component
    public class UrlAspect {
    
        @Pointcut("execution(* com.example.controller.*.*(..))")
        public void pointcut() {
        }
    
        @Around("pointcut()")
        public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            String url = request.getRequestURL().toString();
            System.out.println("请求URL:" + url);
          
            // 执行目标方法
            Object result = joinPoint.proceed();
          
            return result;
        }
    }
    

    上述例子中,我们通过@Aspect注解将UrlAspect类标识为切面,通过@Around注解定义了一个环绕通知方法。在该方法内部,我们通过RequestContextHolder.getRequestAttributes().getRequest()方法获取当前请求的HttpServletRequest对象,然后使用getRequestURL()方法获取请求的URL。

    注意,上述代码中的切面表达式execution(* com.example.controller..(..))指定了切入点,表示拦截com.example.controller包中所有类的所有方法。

    这样,当执行带有RequestMapping注解的方法时,环绕通知将会被触发,从而获取到请求的URL并进行相应处理。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部