Фильтры в сервлетах и JSP являются классами Java, и цель их существования следующая:
Перехват при запросе доступа к серверному ресурсу
Управляйте ответами, возвращаемыми с сервера клиенту.
Ниже перечислены несколько распространенных типов фильтров:
Фильтр аутентификации
Фильтр сжатия данных
фильтр шифрования
Фильтры, запускающие события доступа к ресурсам
Фильтр преобразования изображений
Фильтры входа и аутентификации
Цепной фильтр MIME-типа
Фильтр токенов
Фильтры XSL/T для преобразования содержимого XML
Фильтр будет вставлен в файл web.xml и сопоставлен с именем сервлета, JSP-файла или шаблона URL-адреса. Файл описания развертывания web.xml можно найти в каталоге <каталог-установки-Tomcat>conf.
Когда контейнер JSP запускает веб-приложение, он создает экземпляр каждого фильтра. Эти фильтры должны быть объявлены в файле дескриптора развертывания web.xml и выполняться в том порядке, в котором они объявлены.
Фильтр — это класс Java, реализующий интерфейс javax.servlet.Filter. Интерфейс javax.servlet.Filter определяет три метода:
| серийный номер | Метод и описание |
|---|---|
| 1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) Контейнер будет вызывать этот метод всякий раз, когда запрос/ответ проходит через цепочку фильтров, поскольку клиент запрашивает ресурсы в конце цепочки. |
| 2 | public void init(FilterConfig filterConfig) Контейнер вызывает этот метод, чтобы указать, что фильтр помещен в службу. |
| 3 | public void уничтожить() Этот метод вызывается контейнером, чтобы указать, что фильтр удаляется из службы. |
В этом примере будет распечатан IP-адрес, а также дата и время каждого доступа к файлу JSP. Конечно, это всего лишь простой пример, чтобы дать вам некоторое представление о простом использовании фильтров, но вы можете использовать эти концепции для самостоятельного создания более сложных программ.
//Представляем пакет Java import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import java.util.*; //Реализуем класс Filter public class LogFilter реализует Filter { public void init( Конфигурация FilterConfig) бросает ServletException{ // Получаем параметры инициализации String testParam = config.getInitParameter("test-param"); //Распечатываем параметры инициализации System.out.println("Test Param: " + testParam); } public void doFilter(запрос ServletRequest, ответ ServletResponse, цепочка FilterChain) бросает java.io.IOException, ServletException { // Получаем IP-адрес клиента String ipAddress = request.getRemoteAddr() // Вывод IP-адреса и текущего времени System.out.println("IP "+); ipAddress + ", Time " + new Date().toString()); // Передаем цепочку фильтров запроса Chain.doFilter(request,response); public void Destroy(){ /* После уничтожения экземпляра Filter. сервер Вызывается перед удалением. */ }}Скомпилируйте файл LogFilter.java, а затем поместите скомпилированный файл класса в каталог <каталог установки Tomcat>/webapps/ROOT/WEB-INF/classes.
Фильтры определяются, а затем сопоставляются с URL-адресом или именем файла JSP, подобно тому, как определяются и сопоставляются сервлеты. В файле описания развертывания web.xml используйте тег <filter> для сопоставления фильтров:
<filter> <filter-name>LogFilter</filter-name> <filter-class>LogFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value >Параметр инициализации</param-value> </init-param></filter><filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
Вышеупомянутый фильтр будет применен ко всем сервлетам и программам JSP, поскольку мы указали «/*» в конфигурации. Вы также можете указать путь к сервлету или JSP, если хотите применить фильтр только к нескольким сервлетам или программам JSP.
Теперь обратитесь к сервлету или странице JSP как обычно, и вы найдете запись об этом доступе в журнале сервера. Вы также можете использовать регистратор Log4J для входа в другие файлы.
Ваше веб-приложение может определять множество различных фильтров. Теперь, когда у вас определены два фильтра, AuthenFilter и LogFilter, остальные шаги такие же, как и раньше, за исключением того, что вы создаете другое сопоставление, например:
<filter> <filter-name>LogFilter</filter-name> <filter-class>LogFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value >Параметр инициализации</param-value> </init-param></filter> <filter> <filter-name>AuthenFilter</filter-name> <filter-class>AuthenFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value>Параметр инициализации</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping> <filter-mapping> <filter-name>AuthenFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
Порядок сопоставления элементов <filter> в файле web.xml определяет порядок, в котором контейнер применяет эти фильтры. Чтобы изменить порядок применения, просто измените порядок, в котором элементы <filter> определены в web.xml.
Например, в приведенном выше примере сначала будет применен LogFilter, а затем AuthenFilter, но в следующем примере порядок применения будет обратный:
<filter-mapping> <filter-name>AuthenFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping> <filter-mapping> <filter-name>LogFilter</filter -name> <url-pattern>/*</url-pattern></filter-mapping>