Как выбрать фильтр, перехватчик и фрагмент аспекта?

Java

содержание

  1. предисловие
  2. Фильтр
  3. Перехватчик перехватчик
  4. Срез аспекта
  5. Суммировать

предисловие

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

Фильтр

фильтр можетПерехватывать запросы и ответы на методы(запрос ServletRequest, ответ ServletResponse) и дляответ на запросВыполните операцию фильтрации.

фильтрЗависит от контейнера сервлета. С точки зрения реализации, основанной на обратных вызовах функций, он может фильтровать почти все запросы, а экземпляр фильтра можно использовать только вВызывается один раз при инициализации контейнера.

Цель использования фильтров состоит в том, чтобысделать некоторую фильтрацию, получить данные, которые мы хотим получить, например: изменить кодировку символов в фильтре;Изменить некоторые параметры HttpServletRequest в фильтре, в том числе: фильтрация ненормативной лексики, опасных символов и т. д.

Без лишних слов, давайте начнем с кода

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

Определите еще два контроллера, один UserController и один OrderController.

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

Несмотря на то, что и фильтр фильтра, и запрос контроллера были определены, фильтр сейчас не работает. Вам нужно настроить фильтр, есть два варианта

Первая схема добавляет @Component в фильтр

@Component
public class TimeFilter implements Filter

Вторая схема настраивает фильтр регистрации

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

Вторая особенность заключается в том, чтоURL-адреса уточнены по правилам фильтрации

ДавайтеПри запуске приложения фильтр инициализируется и вызывается функция инициализации..

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

проситьhttp://localhost:9000/order/1

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

Взгляните на вывод журнала консоли

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

проситьhttp://localhost:9000/user/1

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

вывод журнала консоли

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

После остановки приложения вывод консоли

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

Фильтр запускается при старте веб-приложения, который инициализируется только один раз и уничтожается при остановке веб-приложения.

1. Загрузите экземпляр фильтра при запуске сервера ивызвать метод init()инициализировать экземпляр;

2. При каждом запросеВызовите только метод doFilter() для обработки;

3. При остановке сервераВызвать метод destroy(), уничтожить экземпляр.

Давайте еще раз посмотрим на метод doFilter.

doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

Из параметров мы видим, что фильтр можно получитьПараметры запроса и данные ответа; но этот метод не может знать, какой метод в каком классе контроллера выполняется.

Еще один момент, на который следует обратить внимание, заключается в том, что в фильтрах нельзя использовать внедренные bean-компоненты, то есть нельзя использовать @Autowired.

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

надЗначение для внедрения кода равно null. Почему это?

Фактически, в Spring порядок запуска веб-приложений таков:listener->filter->servlet, сначала инициализируйте прослушиватель, а затем инициализируйте фильтр,Затем мы подходим к инициализации нашего dispathServlet, поэтому, когда нам нужно внедрить аннотированный bean-компонент в фильтр, внедрение не удастся,Потому что при инициализации фильтра аннотированный компонент не был инициализирован и не может быть введен.

Перехватчик перехватчик

Зависит от веб-фреймворка, в SpringMVC это зависит от фреймворка SpringMVC. В реализацииМеханизм отражения на основе Java является приложением аспектно-ориентированного программирования (АОП)., то есть перед методом вызовите метод или после метода вызовите метод.

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

Настройте его в WebMvcConfigurationSupport.

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

Результаты

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

Мы обнаружили, что объект Controller можно получить в перехватчике

preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

обработчик объекта - это объект метода контроллера

HandlerMethod handlerMethod = (HandlerMethod)handler;
handlerMethod.getBean().getClass().getName(); //获取类名
handlerMethod.getMethod().getName(); //获取方法名

Но мы обнаружили, что значение параметра метода не может быть получено, почему так? существуетКласс DispatcherServletв, метод

doDispatch(HttpServletRequest request, HttpServletResponse response)

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

applyPreHandleВыполнение этого метода является методом preHandler исполняемого перехватчика, но в этом процессе метод контроллера не получает параметры запроса из запроса и не собирает параметры метода;А вот в методе ha.handle параметры будут собраны

Хотя вы не можете получить параметры метода, вы можете получить bean-компонент IOC.

еще один моментметод postHandler

Выполнение метода postHandler, при возникновении исключения внутри контроллера, метод postHandler выполняться не будет.

метод afterCompletion, вне зависимости от того, есть ли внутри контроллера исключение, этот метод будет выполнен, этот метод также будет иметь параметр Exception ex;Если есть исключение, ex будет иметь ненормальное значение; если исключения нет, это значение равно null

Обратите внимание, что если внутри контроллера есть исключение, но оно равномерно захвачено исключением @ControllerAdvice, ex также будет нулевым.

Срез аспекта

Операции АОП могут перехватывать операции по горизонтали.Самое большое преимущество в том, что он можетПолучить параметры метода выполнения, метод унифицирован. общийИспользовать журнал, транзакцию, проверку безопасности параметра запросаЖдать

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

В приведенном выше коде мы можем получить параметры метода

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

Хотя фасет aop может получать параметры метода, он не может получать объекты ответа и запроса.

Суммировать

Давайте подытожим здесь фильтры, перехватчики и Аспекты, чтобы увидеть разницу.

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

Если три метода используются одновременно, то ихКакой порядок исполненияШерстяная ткань?

filter -> interceptor -> ControllerAdvice -> aspect -> controller

Порядок возвращаемого значения или порядок возврата исключения

controller -> aspect -> controllerAdvice -> Interceptor -> Filter

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

Опишите последовательность выполнения с помощью схемы

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

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

---End---