Как написать перехватчик вручную. Допустим, мне сейчас нужен перехватчик таймера, и я хочу вывести в консоль время, потраченное на каждый вызов сервисной блокировки, как мне это сделать?
Существует три механизма перехвата:
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));
}
}
Объяснение кода:
- Среди них метод preHandle() вызывается до вызова контроллера.
- postHandle() вызывается после вызова контроллера, а не при возникновении исключения
- 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