spring boot通过自定义注解和AOP拦截指定的请求

本文主要通过切面类和自定注解的方式,拦截指定的接口(代码中已经作了详细的说明)

目录

一 准备工作

二 自定义注解

三 切面类

四 Controller类

五 测试结果 

六 源码地址


一 准备工作

1.1 添加依赖

通过spring boot创建好工程后,添加如下依赖,不然工程中无法使用切面的注解,就无法对制定的方法进行拦截

        
            org.springframework.boot
            spring-boot-starter-aop
        

1.2 demo工程 

spring boot通过自定义注解和AOP拦截指定的请求_第1张图片

二 自定义注解

import java.lang.annotation.*;

/**
 * @Target 此注解的作用目标,括号里METHOD的意思说明此注解只能加在方法上面
 * @Retention 注解的保留位置,括号里RUNTIME的意思说明注解可以存在于运行时,可以用于反射
 * @Documented 说明该注解将包含在javadoc中
 */

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MonitorRequest {
}

三 切面类


/**
 * 此类为一个切面类,主要作用就是对接口的请求进行拦截
 * 拦截的方式,只需要在指定接口方法上面加上@MonitorRequest注解即可
 *
 * @author guguoyu
 * @version 1.0
 * @since 2018/10/28
 */
@Aspect
@Component
public class RequestAspect {

    //使用org.slf4j.Logger,这是spring实现日志的方法
    private final static Logger logger = LoggerFactory.getLogger(RequestAspect.class);

    /**
     * 表示在执行被@MonitorRequest注解修饰的方法之前 会执行doBefore()方法
     *
     * @param joinPoint 连接点,就是被拦截点
     */
    @Before(value = "@annotation(com.example.demo.annotation.MonitorRequest)")
    public void doBefore(JoinPoint joinPoint) {
        //获取到请求的属性
        ServletRequestAttributes attributes =
                (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        //获取到请求对象
        HttpServletRequest request = attributes.getRequest();

        //URL:根据请求对象拿到访问的地址
        logger.info("url=" + request.getRequestURL());
        //获取请求的方法,是Get还是Post请求
        logger.info("method=" + request.getMethod());
        //ip:获取到访问
        logger.info("ip=" + request.getRemoteAddr());
        //获取被拦截的类名和方法名
        logger.info("class=" + joinPoint.getSignature().getDeclaringTypeName() +
                "and method name=" + joinPoint.getSignature().getName());
        //参数
        logger.info("参数=" + joinPoint.getArgs().toString());

    }
}

四 Controller类

@RestController
public class TestController {

    /**
     * 添加了自定义注解@MonitorRequest
     * @return
     */
    @MonitorRequest
    @RequestMapping(value = "/test")
    public String test(){
        return "method be added @MonitorRequest";
    }

    /**
     * 没有添加自定义注解
     * @return
     */
    @RequestMapping(value = "test2")
    public String test2(){
        return "method not be added @MonitorRequest";
    }
}

五 测试结果 

spring boot通过自定义注解和AOP拦截指定的请求_第2张图片

 

六 源码地址

https://github.com/guguoyu/demo-monitor

 

你可能感兴趣的:(SpringBoot)