1. Введение в фильтр
Фильтр также называется фильтром. Это самая захватывающая технология в технологии сервлета. Благодаря технологии фильтров, веб -разработчики перехватывают все веб -ресурсы, управляемые веб -серверами: такие как JSP, сервлет, статические файлы изображений или статические HTML -файлы, тем самым достигая некоторых специальных функций. Например, реализуйте некоторые расширенные функции, такие как контроль доступа к разрешению на уровне URL, фильтрация конфиденциального словаря и сжатие информации о ответе.
API сервлета предоставляет интерфейс фильтра. При разработке веб -приложений, если письменный класс Java реализует этот интерфейс, класс Java называется фильтром фильтра. Благодаря технологии фильтров разработчики могут реализовать запросы и ответы пользователей доступа перед доступом к целевому ресурсу, как показано ниже:
2. Как перехватывает фильтр?
В интерфейсе фильтра есть метод Dofilter. Когда мы пишем фильтр и настраиваем, какой веб -ресурс для перехвата, веб -сервер будет вызывать метод фильтра Dofilter каждый раз, прежде чем вызовать метод службы веб -ресурса. Поэтому написание кода в этом методе может достичь следующей цели:
1. Пусть кусок кода выполняется перед вызовом целевого ресурса.
2. Называть ли целевой ресурс (то есть позволить пользователям получить доступ к веб -ресурсу).
3. После вызова целевого ресурса, пусть кусок кода выполните.
Когда веб -сервер вызывает метод DoFilter, он пропустит объект FilterChain. Объект FilterChain является наиболее важным объектом в интерфейсе фильтра. Это также обеспечивает метод Dofilter. Разработчики могут решить, следует ли назвать этот метод в соответствии с их потребностями. Если этот метод будет вызван, веб -сервер будет вызвать метод обслуживания веб -ресурса, то есть доступ к веб -ресурсу будет доступен, в противном случае веб -ресурс не будет доступен.
3. Начало работы с разработкой фильтра
3.1. Шаги разработки фильтра
Разработка фильтра разделена на два шага:
1. Напишите класс Java для реализации интерфейса фильтра и реализации его метода Dofilter.
2. Используйте элементы <FiLTER> и <Filter-Mapping> в файле Web.xml, чтобы зарегистрировать написанный класс фильтра и установить ресурсы, которые он может перехватить.
Пример фильтра:
пакет me.gacl.web.filter; импорт java.io.ioexception; import javax.servlet.filter; import javax.servlet.filterchain; импорт javax.servlet.filterConfig; импорт javax.servlet.servletexception; импорт javax.servlet.servletrequest; javax.servlet.servletresponse;/*** @classname: filterdemo*@description: три типичных приложения фильтра:*, вы можете решить, следует ли вызовать цепочку. Dofilter (запрос, ответ),*, то есть, независимо от того, можно ли выполнить целевой ресурс*, а затем выполнить задачу, а затем выполнить задачу, а затем выполнить задачу, а затем выполнить «Запрос», а затем будет выполнять задачу, а затем выполнить «Запрос», а затем будет выполнять задачу, а затем выполнить «Запрос», а затем будет выполнять задачу. Целевой ресурс выполняется, может быть зафиксирован результат выполнения целевого ресурса, тем самым реализуя некоторые специальные функции* @author: 小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小 � Ответ, цепочка FilterChain) бросает ioException, ServletException {// Пожалуйста, некоторая предварительная обработка по запросу и ответу request.setcharacterencoding ("utf-"); outs.setcharacterencoding ("utf-"); outs.setContenttype ("text/html; charset = utf-"); system.out.println ("FilterDemo перед выполнением !!!); cail.dofilter (recement, response); // Пусть целевой ресурс выполняет и выпустить System.out.println ("FilterDemo после выполнения!!!");}@Overdepublic void destress () {System.out.println ("---- Разрушение фильтра ----");}}; Настройте фильтры в web.xml:
<? xml version = "." Encoding = "utf-"?> <web-app rersion = "." xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w.org//xmlschema-instance" xsi: schemalocation = "http://java.sun.com/xml/nsjavoce http://java.sun.com/xml/ns/javaee/web-app__.xsd "> <sillance-name> </display-name> <selcopply-file-list> <selcopport-file> index.jsp </wervedied-file> </werveding-file-list> <!-Конфигурация Фильтр-> <Filter> <Filter-name> FilterDemo </filter-name> <filter-class> me.gacl.web.filter.filterdemo </filter-class> </filter> <!-Фильтр отображающих Запросы-> <Url-pattern>/*</url-pattern> </filter-mapping> </web-app>
3.2. Фильтруя цепочка
В веб -приложении могут быть разработаны и написаны несколько фильтров, которые объединяются в одну цепочку фильтров.
Веб -сервер решает, какой фильтр сначала вызовет в соответствии с порядком, в котором фильтр зарегистрирован в файле web.xml. Когда вызван метод DoFilter первого фильтра, веб -сервер создаст объект FilterChain, представляющий цепочку фильтра и передает его методу. В методе DoFilter, если разработчик вызывает метод DoFilter объекта FilterChain, веб -сервер проверит, есть ли все еще фильтр в объекте FilterChain. Если есть, называется второй фильтр, и если нет, целевой ресурс вызывается.
4. Жизненный цикл фильтра
4.1. Создание фильтра
Создание и уничтожение фильтра является обязанностью веб -сервера. Когда веб -приложение запускается, веб -сервер создаст объект экземпляра фильтра и вызовет его метод инициирования, чтобы выполнить функцию инициализации объекта, тем самым подготовившись к перехвату для последующих запросов пользователей. Объект фильтра будет создан только один раз, и метод инициации будет выполнен только один раз. Через параметры метода init можно получить объект FilterConfig, представляющий текущую информацию о конфигурации фильтра.
4.2. Разрушение фильтра
Веб -контейнер вызывает метод уничтожения, чтобы уничтожить фильтр. Метод уничтожения выполняется только один раз в течение жизненного цикла фильтра. В методе уничтожения ресурсы, используемые фильтром, могут быть освобождены.
4.3. Интерфейс FilterConfig
При настройке фильтров пользователи могут использовать <init-param> для настройки некоторых параметров инициализации для фильтров. Когда веб -контейнер создает объект фильтра и вызывает его метод init, объект FilterConfig, инкапсулирующий параметры инициализации фильтра, будет передаваться. Следовательно, когда разработчики пишут фильтры, они могут получить:
String getFiltername (): Получите имя фильтра.
String getInitParameter (String name): возвращает значение параметра инициализации с именем, указанным в описании развертывания. Верните NULL, если его не существует.
Перечисление getInitParameterNames (): возвращает набор перечисления имен всех параметров инициализации фильтра.
Public ServletContext getServletContext (): возвращает ссылку на объект контекста сервлета.
Пример: используйте FilterConfig для получения информации о конфигурации фильтра
пакет me.gacl.web.filter; импорт java.io.ioexception; import java.util.enumeration; импорт javax.servlet.filter; import javax.servlet.filterchain; импорт javax.servlet.servlet.servest.servest.servest.serveles.servel. javax.servlet.servletresponse; Public Class FilterDemo реализует фильтр {/* инициализация фильтра* @see javax.servlet.filter#init (javax.servlet.filterconfig)*/ @overpublic void init (filterConfig filterCogceg) Throws Servletexception {System.out.Print. Инициализация ---- ");/*** <Filter> <Filter-name> filterDemo </filter-name> <filter-class> me.gacl.web.filter.filterdemo </filter-class> <!-Параметра инициализации FilterDemo Filter. Фильтр </description> <mame-name> name </param-name> <param-value> gacl </param-value> </init-param> <init-p aram> <description> Настройте параметры инициализации FilterDemo Фильтр </description> <param-name> like </param-name> <param-value> java </param-value> </init-param> </filter> <Filter-Mapping> <Filter-name> FilterDemo </filter-name> <!-"/*" Имя фильтра string filtername = filterConfig.getFiltername (); // Получить параметр инициализации, настроенный в web.xml файл string initparam = filterConfig.getInitParameter ("name"); String initParam = filterConfig.getInitParameter ("like"); // Возвращает набор перечисления имен всех параметров инициализации фильтра. Enumeration <string> initparameternames = filterConfig.getInitParameterNames (); System.out.println (filtername); System.out.println (initparam); System.out.println (initparam); System.out.println (initparam); while (initparameternames.hasmoreElements ()) {string paramname = (string) initparameternames.nextelement (); system.out.println (paramname);}}@overdepublic void dofilter (revletrequest, ответ evtletresponse, filterchain worwes) {System.out.println ("FilterDemo перед выполнением !!!); chain.dofilter (запрос, ответ); // Пусть целевой ресурс будет выполнен и System.out.println ("FilterDemo после выполнения !!!);}@overridePublic void destress () {System.out.println (" --- Разрушение фильтра ---- ");}}}}}}}}}}}} 5. Развертывание фильтра
Развертывание фильтра разделено на два шага:
1. Зарегистрируйте фильтр
2. Картирование фильтра
5.1. Зарегистрировать фильтр
После разработки фильтра необходимо зарегистрироваться в файле web.xml, чтобы вы могли вызвать веб -сервер.
Зарегистрируйте пример фильтра в файле web.xml:
<Filter> <SOMNAD> FILTERDEMO FILTER </description> <Filter-name> FilterDemo </filter-name> <filter-class> me.gacl.web.filter.filterdemo </filter-class> <!-Настройка инициализации Parameters Filter-Filter-Fiftrater RIPT> <MAME-name> Имя </param-name> <param-value> gacl </param-value> </init-param> <init-param> <distice> Настройте параметры инициализации фильтра фильтра фильтра </description> </init-param> </param-ame> <param-value> java </param-value> </init-param> </init-param> </init-param> </init-param> </init-param> </param-ame> <param-value> java </param-value> </init-param> </param-ame> <param-value> java </param-value> </init-par
<Описание> используется для добавления информации о описании. Содержание этого элемента может быть пустым, а <description> не может быть настроено.
<Filter-name> используется для указания имени для фильтра, а содержимое элемента не может быть пусто.
Элемент <filter-class> используется для указания полного квалифицированного имени класса фильтра.
Элемент <init-param> используется для указания параметров инициализации для фильтра, а его дочерний элемент <param-name> указывает имя параметра, а <param-value> указывает значение параметра. В фильтре можно получить доступ к параметрам инициализации с использованием объекта интерфейса FilterConfig. Если фильтр не требуется указывать параметры инициализации, элемент <init-param> не может быть настроен.
5.2. Картографический фильтр
После регистрации фильтра в файле web.xml вы также должны отобразить фильтр в файле web.xml
<!-отображение фильтра-> <Filter-Mapping> <Filter-name> FilterDemo </filter-name> <!-"/*"
Элемент <фильтра> используется для установки ресурса, который отвечает фильтр за перехват. Фильтр перехват, ресурс может быть указан двумя способами: имя сервлета и путь запроса для доступа к ресурсам.
Дочерний элемент <Filter-name> используется для установки имени регистрации фильтра. Это значение должно быть именем фильтра, объявленного в элементе <url-pattern>. Установите путь запроса, перехваченный фильтром (стиль URL, связанный с фильтром)
<servlet-name> указывает имя сервлета, перехваченное фильтром.
<Диспетчер> указывает, как ресурс, перехваченный фильтром, вызывается контейнером сервлета. Это может быть один из запросов, включения, первого и ошибки и запроса по умолчанию. Пользователи могут установить несколько подэлементов <Dispatcher> для указания
Фильтр перехватывает различные способы вызова ресурсов. следующее:
<Filter-Mapping> <Filter-name> testFilter </filter-name> <Url-pattern>/index.jsp </url-pattern> <Диспетчер> запрос </dispatcher> <Диспетчер> Первый </диспетчер> </filter-mapping>
Значения, которые может установить дочерний элемент, и их значения:
1.Request: Когда пользователь напрямую обращается к странице, веб -контейнер вызовет фильтр. Если целевой ресурс доступен через метод include () или forward () requestDispatcher, фильтр не будет вызван.
2. Include: Если целевой ресурс доступен через метод include () requestDispatcher, будет вызван фильтр. Кроме этого, фильтр не будет вызван.
3. FORWARD: Если целевой ресурс доступен через метод Forward () requestDispatcher, будет вызван фильтр, а фильтр не будет вызван в дополнение.
4.Error: Если целевой ресурс вызван через механизм обработки декларативного обработки исключений, будет вызван фильтр. Кроме этого, фильтр не будет вызван.