English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Фильтры JSP

Фильтры в JSP и Servlet - это Java-классы.

Фильтры могут динамически拦截 запросы и ответы, чтобы преобразовывать или использовать информацию, содержащуюся в запросе или ответе.

Могут быть добавлены один или несколько фильтров к Servlet или группе Servlet. Фильтры также могут быть добавлены к файлам JavaServer Pages (JSP) и HTML.

Фильтры - это Java-классы, доступные для программирования Servlet, которые могут выполнять следующие цели:

  • Интерцепция этих запросов перед доступом клиента к ресурсам.

  • Обработка этих ответов до их отправки клиенту.

Различные типы фильтров, рекомендованные стандартами:

  • Фильтры для аутентификации (Authentication Filters).

  • Фильтры для сжатия данных (Data compression Filters).

  • Фильтры для шифрования (Encryption Filters).

  • Фильтры для триггеризации событий доступа к ресурсам.

  • Фильтры для преобразования изображений (Image Conversion Filters).

  • Фильтры для регистрации и аудита (Logging and Auditing Filters).

  • Цепные фильтры MIME-TYPE (MIME-TYPE Chain Filters).

  • Маркирующие фильтры (Tokenizing Filters).

  • Фильтры XSL/T (XSL/T Filters), преобразующие содержимое XML.

Фильтры объявляются через XML-теги в веб-описателе部署а (web.xml) и затем маппинг на имена Servlet или URL-модели в описателе部署а вашего приложения.

Когда веб-контейнер запускает веб-приложение, он создает пример для каждого фильтра, указанного в описателе部署а.

Исполнение фильтра соответствует порядку конфигурации в файле web.xml, обычно фильтры настраивают перед всеми Servlet.

Методы фильтра Servlet

Фильтр - это класс Java, реализующий интерфейс javax.servlet.Filter. Интерфейс javax.servlet.Filter определяет три метода:

НомерМетод & Описание
1public void doFilter (ServletRequest, ServletResponse, FilterChain)
Этот метод выполняет фактическую фильтрацию, когда запрос клиента соответствует URL, установленному фильтром. Servlet контейнер сначала вызывает метод doFilter фильтра. FilterChain используется для доступа к последующим фильтрам.
2public void init(FilterConfig filterConfig)
При запуске веб-приложения веб-сервер создает пример объекта фильтра и вызывает его метод init, читает конфигурацию из web.xml, выполняет инициализацию объекта, готовясь к拦截у запросов пользователей (объект фильтра создается один раз, метод init также выполняется один раз). Разработчик может получить объект FilterConfig, представляющий текущую конфигурацию фильтра, через параметры метода init.
3public void destroy()
Servlet контейнер вызывает этот метод перед уничтожением примера фильтра, в котором должны быть освобождены ресурсы, занимаемые фильтром Servlet.

FilterConfig используется

Метод 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); 
}

Пример фильтра JSP

Вот пример фильтра Servlet, который выводит имя сайта и адрес. Этот пример позволяет вам получить базовое понимание фильтров Servlet, и вы можете использовать те же концепции для создания более сложных приложений с фильтрами:

//导入必需的 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);
    }
}

Маппинг Servlet фильтра в Web.xml

Определите фильтр и затем привяжите его к 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>

Описание узлов конфигурации web.xml

  • <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>, чтобы определить различные способы блокировки фильтром ресурсов.

  • Значения, которые можно установить для подэлемента <dispatcher> и их смысл

    • REQUEST: Когда пользователь напрямую访问 страницу, веб-контейнер вызовет фильтр. Если目标是 через метод include() или forward() RequestDispatcher, то фильтр не будет вызван.

    • INCLUDE: Если目标是 через метод include() RequestDispatcher, то этот фильтр будет вызван. В противном случае, фильтр не будет вызван.

    • FORWARD: Если目标是 через метод forward() RequestDispatcher, то этот фильтр будет вызван, в противном случае, фильтр не будет вызван.

    • ERROR: Если目标是 через механизм обработки исключений declarative, то этот фильтр будет вызван. В противном случае, фильтр не будет вызван.