В этой главе мы обсудим фильтры в JSP. Фильтры сервлетов и JSP — это классы Java, которые можно использовать в программировании сервлетов и JSP для следующих целей:
-
Перехватывать запросы от клиента, прежде чем они получат доступ к ресурсу на стороне сервера.
-
Чтобы манипулировать ответами от сервера, прежде чем они будут отправлены обратно клиенту.
Перехватывать запросы от клиента, прежде чем они получат доступ к ресурсу на стороне сервера.
Чтобы манипулировать ответами от сервера, прежде чем они будут отправлены обратно клиенту.
Существуют различные типы фильтров, предлагаемые спецификациями —
- Фильтры аутентификации
- Фильтры сжатия данных
- Фильтры шифрования
- Фильтры, запускающие события доступа к ресурсам
- Фильтры преобразования изображений
- Фильтры журналирования и аудита
- Цепные фильтры MIME-TYPE
- Фильтры токенизации
- Фильтры XSL / T, которые преобразуют содержимое XML
Фильтры развертываются в файле дескриптора развертывания web.xml и затем сопоставляются с именами сервлетов, JSP или шаблонами URL в дескрипторе развертывания вашего приложения. Файл дескриптора развертывания web.xml находится в каталоге <Tomcat-installation-directory> \ conf .
Когда контейнер JSP запускает ваше веб-приложение, он создает экземпляр каждого фильтра, который вы объявили в дескрипторе развертывания. Фильтры выполняются в том порядке, в котором они объявлены в дескрипторе развертывания.
Методы фильтрации сервлетов
Фильтр — это просто класс Java, который реализует интерфейс javax.servlet.Filter . Интерфейс javax.servlet.Filter определяет три метода:
S.No. | Метод и описание |
---|---|
1 |
public void doFilter (ServletRequest, ServletResponse, FilterChain) Этот метод вызывается контейнером каждый раз, когда пара запрос / ответ проходит через цепочку из-за клиентского запроса на ресурс в конце цепочки. |
2 |
public void init (FilterConfig filterConfig) Этот метод вызывается веб-контейнером, чтобы указать фильтру, что он помещается в службу. |
3 |
публичный void destroy () Этот метод вызывается веб-контейнером, чтобы указать фильтру, что он выводится из эксплуатации. |
public void doFilter (ServletRequest, ServletResponse, FilterChain)
Этот метод вызывается контейнером каждый раз, когда пара запрос / ответ проходит через цепочку из-за клиентского запроса на ресурс в конце цепочки.
public void init (FilterConfig filterConfig)
Этот метод вызывается веб-контейнером, чтобы указать фильтру, что он помещается в службу.
публичный void destroy ()
Этот метод вызывается веб-контейнером, чтобы указать фильтру, что он выводится из эксплуатации.
Пример фильтра JSP
В следующем примере показано, как распечатать IP-адрес клиента и текущую дату и время при каждом обращении к любому файлу JSP. Этот пример даст вам общее представление о фильтре JSP, но вы можете написать более сложные приложения-фильтры, используя ту же концепцию —
// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; // Implements Filter class public class LogFilter implements Filter { public void init(FilterConfig config) throws ServletException { // Get init parameter String testParam = config.getInitParameter("test-param"); //Print the init parameter System.out.println("Test Param: " + testParam); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException { // Get the IP address of client machine. String ipAddress = request.getRemoteAddr(); // Log the IP address and current timestamp. System.out.println("IP "+ ipAddress + ", Time "+ new Date().toString()); // Pass request back down the filter chain chain.doFilter(request,response); } public void destroy( ) { /* Called before the Filter instance is removed from service by the web container*/ } }
Скомпилируйте LogFilter.java обычным способом и поместите файл LogFilter.class в <каталог-установки Tomcat> / webapps / ROOT / WEB-INF / classes .
Сопоставление фильтров JSP в Web.xml
Фильтры определяются и затем сопоставляются с именем файла URL или JSP, почти так же, как определяется сервлет, а затем сопоставляются с шаблоном URL в файле web.xml . Создайте следующую запись для тега фильтра в файле дескриптора развертывания web.xml
<filter> <filter-name>LogFilter</filter-name> <filter-class>LogFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value>Initialization Paramter</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Вышеупомянутый фильтр будет применяться ко всем сервлетам и JSP, потому что мы указали / * в нашей конфигурации. Вы можете указать конкретный сервлет или путь JSP, если хотите применить фильтр только к нескольким сервлетам или JSP.
Теперь попробуйте вызвать любой сервлет или JSP, и вы увидите сгенерированный журнал в журнале вашего веб-сервера. Вы можете использовать Log4J logger для входа выше журнала в отдельном файле.
Использование нескольких фильтров
Ваше веб-приложение может определять несколько разных фильтров с определенной целью. Учтите, вы определяете два фильтра AuthenFilter и LogFilter . Остальная часть процесса останется, как описано выше, за исключением того, что вам нужно создать другое отображение, как указано ниже —
<filter> <filter-name>LogFilter</filter-name> <filter-class>LogFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value>Initialization Paramter</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>Initialization Paramter</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>
Порядок применения фильтров
Порядок элементов сопоставления фильтра в web.xml определяет порядок, в котором веб-контейнер применяет фильтр к сервлету или JSP. Чтобы изменить порядок фильтра, нужно просто изменить элементы сопоставления фильтра в файле web.xml .
Например, в приведенном выше примере сначала будет применен LogFilter, а затем AuthenFilter к любому сервлету или JSP; следующий пример обратный порядок —