Фильтр Фильтр
Фильтр предназначен для фильтрации ресурсов, к которым обращается клиент.Если условия выполняются, он будет освобожден, а если условия не выполнены, он не будет освобожден.Он также может выполнять логическую обработку целевых ресурсов до и после доступа к ним.
шаг:
- Напишите класс фильтра, который реализует интерфейс фильтра.
- Реализовать методы, которые не были реализованы в интерфейсе (сосредоточьтесь на реализации метода doFilter)
- Настроить в web.xml (в основном настроить, какие ресурсы фильтровать)
Пример, класс реализации фильтра:
package com.yyb.filter;
import java.io.IOException;
import javax.servlet.*;
/**
* Created by Administrator on 2017/7/28.
*/
public class FilterDemo implements Filter {
@Override
//Filter创建的时候执行init方法
public void init(FilterConfig filterConfig) throws ServletException {
//1、获得web.xml中filter 的名称<filter-name>FilterDemo</filter-name>
System.out.println(filterConfig.getFilterName());
//2、获得当前filter的初始化参数
System.out.println(filterConfig.getInitParameter("aaa"));
//3、获得servletContext
filterConfig.getServletContext();
System.out.println("init ....");
}
@Override
//doFilter是Filter的核心过滤的方法
/*
* request: 内部封装是客户端http请求的内容
* response: 代表是响应
* FilterChain: 过滤器链对象
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("quick1 running....");
//放行请求
chain.doFilter(request, response);
}
@Override
//Filter对象销毁的时候执行destory方法
public void destroy() {
System.out.println("destroy...");
}
}
веб.xml
<filter>
<filter-name>FilterDemo</filter-name>
<filter-class>com.yyb.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Подробный API фильтра
Жизненный цикл фильтра и методы, связанные с его жизненным циклом, интерфейс фильтра имеет три метода, и все эти три метода относятся к жизни фильтра:
- init(Filterconfig): представляет метод инициализации объекта фильтра, который выполняется при создании объекта фильтра.
- doFilter(ServletRequest,ServletResponse,FilterCha): представляет основной метод фильтра для выполнения фильтрации. Если ресурс был настроен для этого фильтра для фильтрации, метод doFilter будет выполняться каждый раз при доступе к ресурсу.
- destroy(): представляет метод уничтожения фильтра, который выполняется при уничтожении объекта фильтра.
Жизненный цикл объекта Filter
- При создании фильтра: объект фильтра создается при запуске сервера.
- При уничтожении фильтра: фильтр уничтожается при закрытии сервера
init(FilterConfig): параметр config представляет собой объект информации о конфигурации объекта фильтра, а внутренний пакет представляет собой информацию о конфигурации фильтра.
Метод destroy(): выполняется при уничтожении объекта фильтра.
Метод doFilter: doFilter(ServletRequest, ServletResponse, FilterChain), параметр ServletRequest/ServletResponse заключается в том, что веб-контейнер отвечает за создание объекта запроса и ответа в качестве параметров doFilter при каждом выполнении метода doFilter. Запрос и ответ — это запрос и ответ при доступе к сервисному методу целевого ресурса. FilterChain — это объект цепочки фильтров, и запрос может быть выпущен с помощью метода doFilter объекта. Объект цепочки выполняет фильтры последовательно в соответствии с настроенным порядком сопоставления фильтров.
<filter>
<filter-name>FilterDemo</filter-name>
<filter-class>com.yyb.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
конфигурация URL-шаблона
-
Точное соответствие
/Servlet1, выполнение только при доступе к Servlet1 -
Соответствие каталога /aaa/bbb/*
/user/ : Доступ к ресурсам на переднем плане введите этот фильтр
/admin/ : Выполните этот фильтр при доступе к ресурсам в фоновом режиме -
Расширение соответствует *.abc *.jsp
Примечание: url-шаблон может быть заменен именем сервлета или смешанным.
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<!--<url-pattern>/*</url-pattern>-->
<servlet-name>FilterTest</servlet-name>
<servlet-name>FilterTest1</servlet-name>
</filter-mapping>
диспетчер: способ доступа
- ЗАПРОС: значение по умолчанию, означающее выполнение фильтра при прямом доступе к ресурсу.
- FORWARD: выполнять фильтр только при пересылке
- ВКЛЮЧИТЬ: Выполнить фильтр, когда ресурсы включены
- ОШИБКА: Выполнить фильтр при переходе при возникновении ошибки
Пример: web.xml
<filter>
<filter-name>FilterDemo</filter-name>
<filter-class>com.yyb.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
В FilterTest добавьте код пересылки request.getRequestDispatcher("/index.jsp").forward(request, response);
. В настоящее время при доступе к FilterTest фильтр будет выполняться только последовательно, а не дважды. Фильтры не выполняются при пересылке.
Но перенаправление будет выполнено дважды, в FilterTest добавьте код переадресации response.sendRedirect(request.getContextPath()+"/index.jsp");
, и вы увидите результат выполнения.
Роль фильтра
- Извлечение публичного кода
- Методы в запросе и ответе могут быть улучшены (режим декоратора/динамический прокси)
- Выполнить контроль разрешений
Используйте фильтр для решения параметра искаженных китайских символов
package com.ithiema.web.filter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class EncodingFilter implements Filter{
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//request.setCharacterEncoding("UTF-8");
//在传递request之前对request的getParameter方法进行增强
/*
* 装饰者模式(包装)
*
* 1、增强类与被增强的类要实现统一接口
* 2、在增强类中传入被增强的类
* 3、需要增强的方法重写 不需要增强的方法调用被增强对象的
*
*/
//被增强的对象
HttpServletRequest req = (HttpServletRequest) request;
//增强对象
EnhanceRequest enhanceRequest = new EnhanceRequest(req);
chain.doFilter(enhanceRequest, response);
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
class EnhanceRequest extends HttpServletRequestWrapper{
private HttpServletRequest request;
public EnhanceRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
//对getParaameter增强
@Override
public String getParameter(String name) {
String parameter = request.getParameter(name);//乱码
try {
parameter = new String(parameter.getBytes("iso8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return parameter;
}
}