Filter 也称之为过滤器,它是 Servlet 技术中最实用的技术,Web 开发人员通过 Filter 技术,对 web 服务器治理的所有 web 资源:例如 Jsp, Servlet, 动态图片文件或动态 html 文件等进行拦挡,从而实现一些非凡的性能。例如实现 URL 级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级性能。
它次要用于对用户申请进行预处理,也能够对 HttpServletResponse 进行后处理。应用 Filter 的残缺流程:Filter 对用户申请进行预处理,接着将申请交给 Servlet 进行解决并生成响应,最初 Filter 再对服务器响应进行后处理。
filter 性能
在 HttpServletRequest 达到 Servlet 之前,拦挡客户的 HttpServletRequest。依据须要查看 HttpServletRequest,也能够批改 HttpServletRequest 头和数据。
在 HttpServletResponse 达到客户端之前,拦挡 HttpServletResponse。依据须要查看 HttpServletResponse,也能够批改 HttpServletResponse 头和数据。
filter 生命周期
1、public void init(FilterConfig filterConfig) throws ServletException;// 初始化
和咱们编写的 Servlet 程序一样,Filter 的创立和销毁由 WEB 服务器负责。web 应用程序启动时,web 服务器将创立 Filter 的实例对象,并调用其 init 办法,读取 web.xml 配置,实现对象的初始化性能,从而为后续的用户申请作好拦挡的筹备工作(filter 对象只会创立一次,init 办法也只会执行一次)。开发人员通过 init 办法的参数,可取得代表以后 filter 配置信息的 FilterConfig 对象。
2、public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;// 拦挡申请
这个办法实现理论的过滤操作。当客户申请拜访与过滤器关联的 URL 的时候,Servlet 过滤器将先执行 doFilter 办法。FilterChain 参数用于拜访后续过滤器。
3、public void destroy();// 销毁
Filter 对象创立后会驻留在内存,当 web 利用移除或服务器进行时才销毁。在 Web 容器卸载 Filter 对象之前被调用。该办法在 Filter 的生命周期中仅执行一次。在这个办法中,能够开释过滤器应用的资源。
Filter 接口中有一个 doFilter 办法,当开发人员编写好 Filter,并配置对哪个 web 资源进行拦挡后,Web 服务器每次在调用 web 资源的 service 办法之前,都会先调用一下 filter 的 doFilter 办法,因而,在该办法内编写代码可达到如下目标。
web 服务器在调用 doFilter 办法时,会传递一个 filterChain 对象进来,filterChain 对象是 filter 接口中最重要的一个对象,它也提供了一个 doFilter 办法,
开发人员能够依据需要决定是否调用此办法,调用该办法,则 web 服务器就会调用 web 资源的 service 办法,即 web 资源就会被拜访,否则 web 资源不会被拜访。
FilterConfig 接口
用户在配置 filter 时,能够应用为 filter 配置一些初始化参数,当 web 容器实例化 Filter 对象,调用其 init 办法时,会把封装了 filter 初始化参数的 filterConfig 对象传递进来。因而开发人员在编写 filter 时,通过 filterConfig 对象的办法,就可取得以下内容:
String getFilterName();// 失去 filter 的名称。
String getInitParameter(String name);// 返回在部署形容中指定名称的初始化参数的值。如果不存在返回 null.
Enumeration getInitParameterNames();// 返回过滤器的所有初始化参数的名字的枚举汇合。
public ServletContext getServletContext();// 返回 Servlet 上下文对象的援用。
代码
初始代码
第一种办法:
@WebFilter(filterName = "myFilter",urlPatterns = "/*")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException { }
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { }
@Override
public void destroy() {}
}
@SpringBootApplication
@EnableAutoConfiguration
@EnableWebMvc
@ServletComponentScan(basePackages = "com.filter")
public class EghmApplication {public static void main(String[] args) {SpringApplication.run(EghmApplication.class, args);
}
}
第二种办法
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean filterRegistrationBean(){FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new MyFilter2());
bean.addUrlPatterns("/*");
return bean;
}
}