Рукописный перехватчик SpringBoot

Java задняя часть Spring

Как написать перехватчик вручную. Допустим, мне сейчас нужен перехватчик таймера, и я хочу вывести в консоль время, потраченное на каждый вызов сервисной блокировки, как мне это сделать?

Существует три механизма перехвата:

1. Фильтр (Фильтр)Я могу получить http-запрос, но не могу получить информацию о методе обработки запроса.
2. ПерехватчикВы можете получить как информацию HTTP-запроса, так и информацию о методе обработки запроса, но вы не можете получить информацию о параметрах метода.
3. АспектИнформация о параметрах метода может быть получена, но информация о HTTP-запросе не может быть получена.

Все три из них имеют свои преимущества и недостатки, и вам нужно выбрать наиболее подходящий механизм перехвата в соответствии с потребностями вашего бизнеса.

拦截机制图

Хорошо, давайте начнем текст.

Боевой перехватчик почерка


/**
 * Time 时间拦截器(比时间过滤器准))
 * Created by Fant.J.
 */
@Component
public class TimeInterceptor  implements HandlerInterceptor {
    //controller 调用之前被调用
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {
        System.out.println("preHandle");

        System.out.println(((HandlerMethod)handler).getBean().getClass().getName());
        System.out.println(((HandlerMethod)handler).getMethod().getName());
        httpServletRequest.setAttribute("startTime",System.currentTimeMillis());
        return true;
    }

    //controller 调用之后被调用,如果有异常则不调用
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

        System.out.println("postHandle");

        long startTime = (long) httpServletRequest.getAttribute("startTime");
        System.out.println("时间拦截器耗时:"+(System.currentTimeMillis() -startTime));
    }

    //controller 调用之后被调用,有没有异常都会被调用,Exception 参数里放着异常信息
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("afterCompletion");
        long startTime = (long) httpServletRequest.getAttribute("startTime");
        System.out.println("时间拦截器耗时:"+(System.currentTimeMillis() -startTime));
    }
}

Объяснение кода:

  1. Среди них метод preHandle() вызывается до вызова контроллера.
  2. postHandle() вызывается после вызова контроллера, а не при возникновении исключения
  3. afterCompletion() вызывается после вызова контроллера, независимо от того, есть ли исключение или нет, информация об исключении помещается в параметр Exception.

Однако написать этот обрабатывающий перехватчик недостаточно, требуется дальнейшая настройка.Пожалуйста, смотрите следующий код:

/**
 * 引入第三方过滤器 将其放入spring容器
 * Created by Fant.J.
 */
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter{

//    注入Time 拦截器
    @Autowired
    private TimeInterceptor timeInterceptor;
    //添加拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //往拦截器注册器里添加拦截器
        registry.addInterceptor(timeInterceptor);
    }

Во-первых, мы наследуем класс WebMvcConfigurerAdapter и переопределяем его метод addInterceptors(), который добавляет перехватчики в контейнер Spring. Затем вызовите регистр перехватчика InterceptorRegistry для регистрации.

Представляю все мои коллекции:

популярная рамка

SpringCloud springboot nginx redis

Основной принцип реализации:

Учебник по Java NIO Подробное объяснение отражения Java Заметки по изучению параллелизма в Java Учебник по сервлетам Java Подробное объяснение компонентов jdbc Учебник по Java NIO Исследование языка/версии Java