JSP - фильтры
В этой главе мы обсудим фильтры в JSP. Фильтры сервлетов и JSP - это классы Java, которые можно использовать в программировании сервлетов и JSP для следующих целей:
Для перехвата запросов от клиента до того, как он обратится к ресурсу в серверной части.
Для управления ответами сервера перед их отправкой клиенту.
В спецификациях предлагаются различные типы фильтров -
- Фильтры аутентификации
- Фильтры сжатия данных
- Фильтры шифрования
- Фильтры, запускающие события доступа к ресурсам
- Фильтры преобразования изображений
- Фильтры регистрации и аудита
- Цепные фильтры MIME-типа
- Токенизирующие фильтры
- 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 | public 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-installation-directory>/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; следующий пример изменит порядок -
<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>