1. перехватчики и фильтры
Прежде чем говорить о Spring Boot, давайте сначала посмотрим на фильтры и перехватчики. Эти два очень похожи с точки зрения функций, но в конкретной технической реализации все еще существует большой пробел. Прежде чем анализировать различия между ними, давайте сначала поймем концепцию AOP. AOP - это не конкретная технология, а идея программирования. В процессе объектно-ориентированного программирования нам легко решить вертикальное расширение посредством наследования и полиморфизма. Однако для горизонтальных функций, таких как включение транзакций во всех методах обслуживания или унифицированное ведение журнала, объектно-ориентированные функции не могут быть решены. Следовательно, AOP-ориентированное программирование на самом деле является дополнением к идее объектно-ориентированного программирования. Фильтры и перехватчики, о которых мы говорим сегодня, являются конкретными реализациями, ориентированным на аспекцию программирования. Основные различия между ними включают следующие аспекты:
1. Фильтр зависит от контейнеров сервлетов и является частью спецификации сервлета. Перехватыватели существуют независимо и могут использоваться при любых обстоятельствах.
2. Выполнение фильтра завершено с помощью обратного вызова контейнера сервлета, а перехватчик обычно выполняется с помощью динамического прокси.
3. Жизненный цикл фильтра управляется контейнером сервлета, в то время как перехватчик можно управлять через контейнеры МОК. Следовательно, экземпляры других бобов могут быть получены с помощью инъекций и других методов, поэтому их будет удобнее использовать.
2. Фильтр конфигурации
Теперь мы используем фильтры, чтобы реализовать функцию записи времени выполнения запросов, что реализуется следующим образом:
public class LogCostFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { long start = System.currentTimeMillis(); FilterChain.dofilter (ServletRequest, Servletresponse); System.out.println ("execute stost ="+(system.currenttimemillis ()-start)); } @Override public void destry () {}}Логика этого кода относительно проста, которая заключается в записи временной метки до выполнения метода, а затем завершить выполнение запроса через цепочку фильтра и рассчитать время выполнения между возвращенными результатами. Главное здесь в том, что этот класс должен наследовать класс фильтра. Это спецификация сервлета, которая ничем не отличается от предыдущих веб -проектов. Однако с помощью класса фильтров предыдущие веб -проекты могут быть настроены в web.xml, но в проекте Spring Boot нет файла web.xml, так как его настроить? В Spring Boot нам нужна FilterRegistrationBean, чтобы завершить конфигурацию. Процесс реализации выглядит следующим образом:
@ConfigurationPublic Class FilterConfig {@Bean Public FilterRegistrationBean RegistrationFilter () {FilterRegistrationBean Registration = new FilterRegistrationBean (); Registration.SetFilter (new LogCostFilter ()); registration.addurlpatterns ("/*"); registration.setName ("logCostfilter"); Регистрация.setOrder (1); вернуть регистрацию; }}Эта конфигурация завершена. Параметры, которые необходимо настроить в основном, включают в себя создание создания класса фильтра, а затем определение шаблона соответствия URL -адреса, установив имя и порядок выполнения фильтра. Этот процесс на самом деле ничем не отличается от конфигурации в web.xml, но форма просто отличается. Теперь мы можем начать сервер, чтобы получить доступ к любому URL:
Вы можете видеть, что вышеуказанная конфигурация вступила в силу. В дополнение к настройке через FilterRegistrationBean, существует также более прямой способ, который может быть завершен непосредственно через аннотации:
@Webfilter (urlpatterns = "/*", filtername = "logfilter2") открытый класс logcostfilter2 реализует фильтр {@override public void init (filterConfig filterConfig) ThripseSectons {} @Override public void dofilters FilterChain) бросает ioException, ServletException {long Start = System.currentTimeMillis (); FilterChain.dofilter (ServletRequest, Servletresponse); System.out.println ("logfilter2 execute vall =" + (System.currentTimeMillis () - Start)); } @Override public void destry () {}}Здесь вы можете настроить его напрямую с помощью @webfilter. Точно так же вы можете установить режим соответствия URL -адреса, имя фильтра и т. Д. Здесь следует отметить, что аннотация @WebFilter является спецификацией Сервлета 3.0 и не предоставляется Spring Boot. В дополнение к этой аннотации, нам также необходимо добавить еще одну аннотацию в класс конфигурации: @servletcomponetscan, указав отсканированный пакет.
@SpringbootApplication@mapperscan ("com.pandy.blog.dao")@servletcomponentscan ("com.pandy.blog.filters") Приложение открытого класса {public static void main (string [] args) бросает исключение {springapplication.run (application.class, args); }} Теперь давайте снова посетим любой URL:
Как вы можете видеть, оба фильтра, которые мы настроили, вступили в силу. Осторожные читатели обнаружит, что мы не указываем порядок выполнения второго фильтра, но выполняем перед первым фильтром. Здесь следует объяснить, что аннотация @WebFilter не указывает атрибут порядка выполнения. Его порядок выполнения зависит от имени фильтра и расположен в обратном порядке на основе алфавитного порядка имени класса фильтра (обратите внимание, что это не имя настроенного фильтра). Приоритет фильтра, указанный @webfilter, выше, чем фильтр, настроенный FilterRegistrationBean. Друзья, которые заинтересованы, могут экспериментировать самостоятельно.
3. Конфигурация перехвата
Мы уже представили метод конфигурации фильтра выше. Затем давайте посмотрим, как настроить перехватчик. Мы используем перехватчик для реализации той же функции выше, записывая время выполнения запроса. Сначала мы реализуем класс перехвата:
открытый класс logcostinterceptor реализует handlerinterceptor {long start = system.currenttimemillis (); @Override public boolean prehandle (httpservlectrequest httpservletrequest, httpservletresponse httpservletresponse, объект o) Throws Exception {start = System.currentTimeMillis (); вернуть истину; } @Override public void posathandle (httpservletrequest httpservletrequest, httpservletresponse httpservletresponse, объект o, модель и модель модели и throws exception {system.out.println ("receptor stod ="+(System.currentTimillis ()-start); } @Override public void -последствия (httpservletrequest httpservletrequest, httpservletresponse httpservletresponse, объект o, исключение e), бросает исключение {}}Здесь нам нужно реализовать интерфейс Handlerinterceptor. Этот интерфейс включает в себя три метода. Prehandle выполняется до выполнения запроса, а постхандлер выполняется после выполнения запроса, но он будет выполнен только тогда, когда метод Prehandle возвращает true. После завершения выполнения после завершения визуализации рендеринг. Prehandle также должен вернуть True. Этот метод обычно используется для очистки ресурсов и других задач. В дополнение к реализации вышеуказанного интерфейса, нам также необходимо настроить его:
@Configurationpublic class receptorconfig extends webmvcconfigureradapter {@override public void addinterceptors (реестр receptortorgistry) {Registry.addinterceptor (новый logcostinterceptor ()). Addpathpatterns ("/**"); Super.addinterceptors (реестр); }}Здесь мы унаследовали WebMVCConfigurerAdapter. Друзья, которые читали предыдущие статьи, должны были увидеть этот класс. Мы использовали этот класс при настройке каталога статических ресурсов. Здесь мы переписали метод AddInterceptors для настройки перехватчика. Существует два основных элемента конфигурации: один - указать перехватчик, а другой - указать URL -адрес перехвата. Теперь мы запускаем систему и получаем доступ к любому URL:
Как вы можете видеть, мы достигли той же функции через перехватчик. Однако здесь следует отметить, что эта реализация на самом деле проблематична, потому что Prehandle и Posthandle являются двумя методами, поэтому мы должны установить начало общей переменной для хранения начальной стоимости, но это будут иметь проблемы с безопасностью потока. Конечно, мы можем решить эту проблему другими методами, такими как Threadlocal, которые можно решить хорошо, и заинтересованные студенты могут реализовать ее сами. Тем не менее, благодаря этому мы можем видеть, что, хотя перехватчики лучше, чем фильтры во многих сценариях, в этом сценарии фильтры проще реализовать, чем перехватчики.
4. Резюме
В этой статье в основном объясняется конфигурация фильтров и перехватчиков на основе Spring Boot. Как фильтры, так и перехватчики принадлежат к конкретной реализации идеи AOP (ориентированное на раздел). В дополнение к этим двум реализациям, мы также видели еще одну более гибкую технологию реализации AOP, а именно аспект, где мы можем выполнять все более и более мощные функции через аспект. Я поделюсь этим с тобой позже.