Общ преглед и необходимост от делегиране на филтърпрокси през пролетта

1. Общ преглед

В DelegatingFilterProxy е сървлет филтър, който позволява преминаване контрол Филтър класове, които имат достъп до контекста на приложението пролет. Spring Security разчита много на тази техника.

В този урок ще го разгледаме подробно.

2. DelegatingFilterProxy

В Javadoc за DelegatingFilterProxy се посочва, че това е

Прокси за стандартен филтър за сървлети, делегиращ на пролетно управляван боб, който реализира интерфейса на филтъра.

Когато използваме филтри за сървлети, очевидно трябва да ги декларираме като филтър-клас в нашия Java-config или web.xml , в противен случай контейнерът за сървлети ще ги игнорира. Spring's DelegatingFilterProxy осигурява връзката между web.xml и контекста на приложението.

2.1. Вътрешна работа на DelegatingFilterProxy

Нека да разгледаме как DelegatingFilterProxy прехвърля контрола към нашия пролетен боб.

По време на инициализация, DelegatingFilterProxy извлича -името на филтъра и извлича боб с това име от Context Пролет кандидатстване. Този боб трябва да е от тип javax.Servlet.Filter, т.е. „нормален“ филтър за сървлети. След това входящите заявки ще бъдат предадени на този филтър.

Накратко, методът doFilter () на DelegatingFilterProxy ще делегира всички извиквания на Spring bean, което ни позволява да използваме всички функции Spring в нашия филтър bean.

Ако използваме Java-базирана конфигурация, регистрацията ни на филтър в ApplicationInitializer ще бъде дефинирана като:

@Override protected javax.servlet.Filter[] getServletFilters() { DelegatingFilterProxy delegateFilterProxy = new DelegatingFilterProxy(); delegateFilterProxy.setTargetBeanName("applicationFilter");   return new Filter[]{delegateFilterProxy}; }

Ако използваме XML, тогава във файла web.xml :

 applicationFilter org.springframework.web.filter.DelegatingFilterProxy 

Това означава, че може да се направи всяка заявка за преминаване през филтъра, определен като Spring bean с името applicationFilter .

2.2. Необходимост от DelegatingFilterProxy

DelegatingFilterProxy е клас в уеб модула на Spring. Той предоставя функции за извършване на HTTP повиквания, преминаващи през филтри, преди да достигнат действителната дестинация. С помощта на DelegatingFilterProxy, клас изпълнение на javax.Servlet.Filter интерфейс може да бъде преведена в филтър верига.

Като пример Spring Security използва DelegatingFilterProxy, за да може да се възползва от функциите за инжектиране на зависимостите на Spring и интерфейсите на жизнения цикъл за защитни филтри.

DelegatingFilterProxy също така използва извикване на специфични или множество филтри според URI пътищата на Request, като предоставя конфигурацията в контекста на приложението на Spring или в web.xml.

3. Създаване на персонализиран филтър

Както е описано по-горе, DelegatingFilterProxy е самият филтър за сървлети, който делегира на специфичен управляван от Spring компонент, който реализира филтърния интерфейс.

В следващите няколко раздела ще създадем персонализиран филтър и ще го конфигурираме с помощта на Java и XML-базирана конфигурация.

3.1. Клас на филтъра

Ще създадем прост филтър, който регистрира информация за заявката, преди заявката да продължи по-нататък.

Нека първо създадем персонализиран клас на филтър:

@Component("loggingFilter") public class CustomFilter implements Filter { private static Logger LOGGER = LoggerFactory.getLogger(CustomFilter.class); @Override public void init(FilterConfig config) throws ServletException {        // initialize something } @Override public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; LOGGER.info("Request Info : " + req); chain.doFilter(request, response); } @Override public void destroy() { // cleanup code, if necessary } } 

CustomFilter реализира javax.Servlet.Filter . Този клас има анотация @Component, за да се регистрира като Spring bean в контекста на приложението. По този начин DelegatingFilterProxy клас може да намерите в нашия клас на филтъра по време на нулиране на филтъра верига.

Имайте предвид, че името на пролетния боб трябва да бъде същата като стойността в -името на филтъра , предоставена по време на регистрацията на персонализиран филтър в ApplicationInitializer клас или в web.xml по-късно , защото на DelegatingFilterProxy класа ще търси филтъра боб с точно същото име в контекста на приложението.

Ако не може да намери боб с това име, той ще създаде изключение при стартиране на приложението.

3.2. Конфигуриране на филтъра чрез Java конфигурация

За да регистрираме персонализиран филтър, използвайки Java конфигурация, трябва да заменим метода getServletFilters () на AbstractAnnotationConfigDispatcherServletInitializer :

public class ApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { // some other methods here @Override protected javax.servlet.Filter[] getServletFilters() { DelegatingFilterProxy delegateFilterProxy = new DelegatingFilterProxy(); delegateFilterProxy.setTargetBeanName("loggingFilter");   return new Filter[]{delegateFilterProxy}; } }

3.3. Конфигуриране на филтъра чрез web.xml

Нека да видим как изглежда конфигурацията на филтъра в web.xml :

 loggingFilter org.springframework.web.filter.DelegatingFilterProxy   loggingFilter /* 

Най- филтър клас аргумент е от тип DelegatingFilterProxy , а не на класа филтър ние създадохме. Ако стартираме този код и ударим който и да е URL, тогава методът doFilter () на CustomFilter ще се изпълни и ще покаже подробностите за информация за заявката в регистрационния файл.

4. Заключение

В тази статия разгледахме как работи DelegatingFilterProxy и как да го използваме.

Spring Security широко използва DelegatingFilterProxy за защита на извикванията и ресурсите на уеб API от неоторизиран достъп.

Изходният код е достъпен в GitHub.