English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Фильтры Servlet могут динамически перехватывать запросы и ответы, чтобы преобразовывать или использовать информацию, содержащуюся в запросе или ответе.
Можно добавить один или несколько фильтров Servlet к Servlet или группе Servlet. Фильтры Servlet также могут быть добавлены к файлам JavaServer Pages (JSP) и HTML. Все добавленные фильтрыServlet вызываются перед вызовом Servlet.
Фильтры Servlet - это классы Java, доступные для программирования Servlet, которые могут реализовать следующие цели:
Перехват этих запросов перед их доступом к ресурсам на заднем конце.
Обработка этих ответов перед отправкой их клиенту.
Различные типы фильтров, рекомендованные стандартами:
Аутентификационные фильтры (Authentication Filters).
Фильтры сжатия данных (Data compression Filters).
Шифрующие фильтры (Encryption Filters).
Фильтры, инициирующие события доступа к ресурсам.
Фильтры преобразования изображений (Image Conversion Filters).
Журналирующие и аудирующие фильтры (Logging and Auditing Filters).
Чained MIME-TYPE фильтры (MIME-TYPE Chain Filters).
Токенизирующие фильтры (Tokenizing Filters).
Фильтры XSL/T (XSL/T Filters), преобразующие содержимое XML.
Фильтры объявляются через XML-теги в веб-описателе развертывания (web.xml) и затем привязываются к имени Servlet или URL-образцу в описателе развертывания вашего приложения.
Когда веб-контейнер запускает веб-приложение, он создает пример для каждого фильтра, который вы указали в описателе развертывания.
Порядок выполнения фильтра соответствует порядку配置а в файле web.xml, обычно фильтр конфигурируется перед всеми Servlet.
Фильтр - это класс Java, реализующий интерфейс javax.servlet.Filter. Интерфейс javax.servlet.Filter определяет три метода:
Номер | Номер метода & описание |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) Этот метод выполняет фактическую операцию фильтрации, когда метод запроса клиента соответствует URL, настроенному фильтром. Servlet контейнер сначала вызывает метод doFilter фильтра. FilterChain используется для доступа к следующим фильтрам. |
2 | public void init(FilterConfig filterConfig) При запуске web приложения веб сервер создает пример объекта фильтра и вызывает его метод init, читает конфигурацию из web.xml, выполняет инициализацию объекта, чтобы подготовить его к拦截у последующих запросов пользователей (объект фильтра создается только один раз, а метод init выполняется только один раз). Разработчик может получить объект FilterConfig, представляющий текущую конфигурацию фильтра, через параметры метода init. |
3 | public void destroy() Servlet контейнер вызывает этот метод перед уничтожением примера фильтра, в котором следует освободить ресурсы, занимаемые Servlet фильтром. |
Метод init фильтра предоставляет объект FilterConfig.
Как показано в файле web.xml, конфигурация фильтра может выглядеть так:
<filter> <filter-name>LogFilter</filter-name> <filter-class>com.w3codebox.test.LogFilter</filter-class> <init-param> <param-name>Site</param-name> <param-value>Базовый учебник</param-value> </init-param> </filter>
В методе init используется объект FilterConfig для получения параметров:
public void init(FilterConfig config) throws ServletException { // Получение инициализационных параметров String site = config.getInitParameter("Site"); // 输出初始化参数 System.out.println("网站名称: " + site); }
Ниже приведен пример фильтра Servlet, который выводит имя сайта и адрес. Этот пример поможет вам получить базовое понимание фильтров Servlet, и вы можете использовать те же концепции для создания более сложных приложений с фильтрами:
package com.w3codebox.test; //导入必需的 java 库 import javax.servlet.*; import java.util.*; // Реализация класса Filter public class LogFilter implements Filter { public void init(FilterConfig config) throws ServletException { // Получение инициализационных параметров String site = config.getInitParameter("Site"); // 输出初始化参数 System.out.println("网站名称: " + site); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException { // 输出站点名称 System.out.println("站点网址:http://ru.oldtoolbag.com"); // 把请求传回过滤链 chain.doFilter(request,response); } public void destroy( ){ /* 在 Filter 示例被 Web 容器从服务移除之前调用 */ } }
这边使用前文提到的 DisplayHeader.java 为实例:
//导入必需的 java 库 import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/DisplayHeader") //扩展 HttpServlet 类 public class DisplayHeader extends HttpServlet { // 处理 GET 方法请求的方法 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应内容类型 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "HTTP Header запрос пример - Основной учебник сайт пример"; String docType = "<!DOCTYPE html> \n" out.println(docType + "<html>\n"+ "<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n"+ "<body bgcolor=\"#f0f0f0\">\n"+ "<h1 align=\"center\">" + title + "</h1>\n"+ "<table width=\"100%\" border=\"1\" align=\"center\">\n"+ "<tr bgcolor=\"#949494\">\n"+ "<th>Название заголовка</th><th>Значение заголовка</th>\n"+ "</tr>\n"); Enumeration headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()) { String paramName = (String)headerNames.nextElement(); out.print("<tr><td>" + paramName + "</td>\n"); String paramValue = request.getHeader(paramName); out.println("<td> " + paramValue + "</td></tr>\n"); } out.println("</table>\n</body></html>"); } // Обработка метода запроса POST public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
Определите фильтр и затем его привязку к URL или Servlet, что примерно соответствует определению Servlet и его привязке к URL-маске. В файле описания部署а web.xml Создайте следующий раздел для тега filter в
<?xml version="1.0" encoding="UTF-8"?> <web-app> <filter> <filter-name>LogFilter</filter-name> <filter-class>com.w3codebox.test.LogFilter</filter-class> <init-param> <param-name>Site</param-name> <param-value>Базовый учебник</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <!-- Имя класса --> <servlet-name>DisplayHeader</servlet-name> <!-- Расположение пакета --> <servlet-class>com.w3codebox.test.DisplayHeader</servlet-class> </servlet> <servlet-mapping> <servlet-name>DisplayHeader</servlet-name> <!-- Адрес посещения --> <url-pattern>/TomcatTest/DisplayHeader</url-pattern> </servlet-mapping> </web-app>
Указанные фильтры применяются ко всем Servlet, потому что мы указали это в конфигурации /* . Если вы хотите применить фильтр только к нескольким Servlet, вы можете указать конкретный путь Servlet.
Теперь试着 вызвать любой Servlet стандартным способом, и вы увидите лог, генерируемый веб-сервером. Вы также можете использовать записывать лог в отдельный файл с помощью записывающего регистратора Log4J.
Далее мы посещаем этот примерного адреса http://localhost:8080/TomcatTest/DisplayHeader, затем посмотрите на вывод в консоли, например:
Веб-приложение может определить несколько различных фильтров для конкретных целей. Предположим, что вы определили два фильтра AuthenFilter и LogFilter. Вам нужно создать карту, аналогичную следующей, для обработки остальных аналогично вышеизложенному:
<filter> <filter-name>LogFilter</filter-name> <filter-class>com.w3codebox.test.LogFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value>Initialization Parameter</param-value> </init-param> </filter> <filter> <filter-name>AuthenFilter</filter-name> <filter-class>com.w3codebox.test.AuthenFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value>Initialization Parameter</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-mapping в web.xml определяет порядок применения фильтров к сервлетам веб-контейнером. Чтобы изменить порядок фильтров, нужно просто изменить порядок элементов filter-mapping в файле 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>
<filter> назначает фильтр.
<filter-name> используется для назначения имени фильтру. Содержимое этого элемента не может быть пустым.
Элемент <filter-class> используется для указания полного ограниченного имени класса фильтра.
Элемент <init-param> используется для назначения инициализационных параметров фильтру. Подэлемент <param-name> определяет имя параметра, а <param-value> определяет значение параметра.
В фильтре можно использовать объект интерфейса FilterConfig для доступа к инициализационным параметрам.
Элемент <filter-mapping> используется для настройки ресурсов, которые отвечает за перехват фильтра. Ресурсы,拦截的资源可以通过两种方式指定: имя сервлета и путь к ресурсу, доступному для запроса.
<filter-name> элемент используется для настройки регистрационного имени фильтра. Это значение должно быть именем фильтра, заявленным в элементе <filter>.
<url-pattern> устанавливает путь запроса,拦截аемый фильтром (стиль URL, связанный с фильтром)
<servlet-name> определяет имя Servlet,拦截 которые фильтр.
<dispatcher> определяет способ, которым Servlet контейнер вызывает ресурсы,拦截аемые фильтром, и может быть одним из REQUEST, INCLUDE, FORWARD или ERROR, по умолчанию REQUEST. Пользователь может установить несколько элементов <dispatcher>, чтобы指定 различные方式的拦截 для ресурсов Filter.
Значения, которые можно установить для элемента <dispatcher> и их значение
REQUEST: Когда пользователь напрямую访问 страницу, веб-контейнер вызовет фильтр. Если целевой ресурс доступен через метод include() или forward() RequestDispatcher, то фильтр не будет вызван.
INCLUDE: Если целевой ресурс доступен через метод include() RequestDispatcher, то этот фильтр будет вызван. В противном случае, фильтр не будет вызван.
FORWARD: Если целевой ресурс доступен через метод forward() RequestDispatcher, то этот фильтр будет вызван, в противном случае, фильтр не будет вызван.
ERROR: Если целевой ресурс вызывается через механизм обработки исключений declarative, то этот фильтр будет вызван. В противном случае, фильтр не будет вызван.