Latest web development tutorials

Servlet Написание фильтров

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

Один или несколько сервлетов фильтры могут быть присоединены к Servlet или Servlet. Servlet фильтры также могут быть присоединены к JavaServer Pages (JSP) файлы и HTML-страниц. Вызов всех дополнительных фильтров сервлетов перед вызовом сервлета.

Servlet фильтры доступны для класса программирования Java Servlet, вы можете решить следующие задачи:

  • Перед обращением доступ к серверным ресурсам, клиент перехватывают эти запросы.
  • Перед тем как сервер отправляет ответ обратно клиенту, чтобы иметь дело с этими ответами.

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

  • Аутентификация фильтр (Authentication фильтры).
  • Сжатие данных фильтра (сжатие данных фильтров).
  • Шифрование Фильтры (шифрование фильтры).
  • Ресурс фильтра инициирующее событие доступа.
  • фильтры преобразования изображения (конвертация изображений фильтры).
  • Протоколирование и аудит фильтров (Протоколирование и аудит фильтров).
  • Цепь фильтра MIME-TYPE (MIME-типа цепочки фильтров).
  • Маркированный фильтр (Tokenizing фильтры).
  • XSL T фильтр / (XSL / T фильтры), преобразование содержимого XML.

Фильтр дескриптора развертывания (web.xml) в XML-тегов с помощью веб-заявления, а затем отображается в Дескриптор имя сервлета или шаблон 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)
web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
3public void destroy()
Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。

использование FilterConfig

Метод инициализации Filter предоставляет объект FilterConfig.

Web.xml файл конфигурации следующим образом:

<filter>
	<filter-name>LoginFilter</filter-name>
	<filter-class>com.w3big.test.LogFilter</filter-class>
	<init-param>
		<param-name>Site</param-name>
		<param-value>本教程</param-value>
	</init-param>
	</filter>

Используйте объект FilterConfig, чтобы получить параметры в методе инициализации:

public void  init(FilterConfig config) throws ServletException {
	// 获取初始化参数
	String site = config.getInitParameter("Site"); 
	// 输出初始化参数
	System.out.println("网站名称: " + site); 
}

экземпляр фильтра Servlet

Ниже приведены примеры сервлетов фильтров, имя выходного и адрес веб-сайта. Примеры сервлетов, чтобы дать вам общее представление о фильтре, вы можете использовать ту же концепцию, чтобы писать более сложные приложения фильтров:

package com.w3big.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://www.w3big.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>Header 名称</th><th>Header 值</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);
	}
}

Web.xml отображение сервлета фильтра (Фильтр сервлета Mapping)

Определить фильтры, а затем сопоставляются с URL или Servlet, которые определяют Servlet, а затем сопоставляются шаблону URL почти таким же способом. Создайте следующую запись для фильтра тега в файл описания развертыванияweb.xml:

<?xml version="1.0" encoding="UTF-8"?>  
<web-app>  
<filter>
  <filter-name>LogFilter</filter-name>
  <filter-class>com.w3big.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.w3big.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: // локальный: 8080 / TomcatTest / DisplayHeader, а затем посмотреть на выходе в консоли, следующим образом :

С использованием множества фильтров

Веб-приложения могут быть несколько различных фильтров, основанных на конкретной цели, определенной. Предположим , что вы определили два фильтраAuthenFilterиLogFilter.Необходимо создать другое отображение, описанное ниже, и выше остальной части процесса, по существу, то же самое объяснение:

<Filter>
   LogFilter <имя-фильтра /> <имя-фильтра>
   <Фильтр-класс> com.w3big.test.LogFilter </ фильтр класса>
   <Init-PARAM>
	  <Парам-имя>-тест PARAM </ PARAM-имя>
	  <Парам-значение> Инициализация параметра Я </ PARAM-значение>
   </ Init-PARAM>
</ Filter>

<Filter>
   AuthenFilter <имя-фильтра /> <имя-фильтра>
   <Фильтр-класс> com.w3big.test.AuthenFilter </ фильтр класса>
   <Init-PARAM>
	  <Парам-имя>-тест PARAM </ PARAM-имя>
	  <Парам-значение> Инициализация параметра Я </ PARAM-значение>
   </ Init-PARAM>
</ Filter>

<Фильтр-отображение>
   LogFilter <имя-фильтра /> <имя-фильтра>
   <URL-шаблон> / * </ URL-шаблон>
</ Фильтр-отображение>

<Фильтр-отображение>
   AuthenFilter <имя-фильтра /> <имя-фильтра>
   <URL-шаблон> / * </ URL-шаблон>
</ Фильтр-отображение>

Фильтры применяются последовательно

Заказ в web.xml фильтр-отображения элемента определяет веб-контейнер для применения фильтров к заказу Servlet. Чтобы изменить порядок фильтра, вам нужно всего лишь обратный элемент фильтра отображения в файле 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> Указывает фильтр заблокирован имя сервлета.
  • <dispatcher> указать фильтр перехваченные ресурсы называются Servlet контейнеров, которые могут быть по REQUEST , INCLUDE , FORWARD и ERROR один по умолчанию REQUEST . Пользователи могут настроить несколько <dispatcher> подэлемент используется для указания Фильтр ресурс несколько способов перехвата вызовов.
  • <dispatcher> значение и значение подэлементов , которые могут быть установлены
    • REQUEST : Когда пользователь прямой доступ к страницам, Web - контейнер будет вызывать фильтр. Если целью является метод доступа к ресурсу, то фильтр не будет вызван включать () вперед или RequestDispatcher (в).
    • INCLUDE : Если целевой ресурс доступен через RequestDispatcher включают в себя (), то фильтр будет называться. Кроме того, фильтры не будут называться.
    • FORWARD : Если целевой ресурс доступен через RequestDispatcher вперед () метод, то фильтр будет вызван, кроме того, фильтр не будет вызываться.
    • ERROR : Если целевой ресурс через декларативный механизм обработки исключений называется, то фильтр будет называться. Кроме того, фильтр не будет вызван.