Web|Web 基础19 Filter入门

1.1Filter的概述 1.1.1 Filter的简介

  • Filter也称之为过滤器,Filter是Servlet技术中最激动人心的技术,
  • Filter可以管理WEB服务器中所有的WEB资源,
  • Filter可以对JSP,Servlet,HTML,以及图片文件等进行拦截和过滤,
  • Filter常用于实现一些特殊的功能,比如访问权限的控制,敏感词汇的过滤,乱码的处理等等,
  • Filter其实就是一个特殊的Servlet,
  • Servlet API提供了Filter接口,在WEB项目中,一个Java类实现了Filter接口,那这个Java类他就是Filter过滤器,
  • Filter其实就是在用户访问目标资源之前,对请求和响应进行拦截过滤和处理。
1.1.2 Filter与Listener(下一节)
??Filter和Listener是Servlet规范中的两个高级特性,不同于servlet ,他们不用于处理客户端请求,只用于对request,response进行修改,或者对context,session,request事件进行监听,为我们Servlet提供一些额外的辅助性功能,帮助我们简化开发。
1.1.3 Filter过滤器可以完成的事
  • 让不让你过(检验用户是否登录)
  • 改变你中间的内容(统一全站的字符编码,替换敏感词汇)
  • 会有简单案例演示
1.1.4 Filter的作用
  • 在httpServletRequest到达Servlet之前,拦截客户的HTTPServletRequest
  • 根据要求检查httpServletRequest,也可以修改httpServletRequest头和数据
  • 在httpServletResponse到达Servlet之前,拦截客户的HTTPServletResponse
  • 根据要求检查httpServletResponse,也可以修改httpServletResponse头和数据
  • 图解
Web|Web 基础19 Filter入门
文章图片
Filter执行过程.png 在服务器与web资源之间,Filter对请求与响应进行操作
1.2 Filter的入门案例
  • 在WEB项目中创建一个Java类,
  • 让该类实现javax.servlet.Filter接口,
  • 在该类中实现Filter接口的所有方法,
public class FilterDemo implements Filter {@Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub}@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("FilterDemo执行"); //放行 chain.doFilter(request, response); }@Override public void destroy() { // TODO Auto-generated method stub}}

  • 在web.xml文件中进行相关的配置。
FilterDemo FilterDemo com.itheima.filter.FilterDemo FilterDemo /*

  • 注意
    • filter是一个特殊的Servlet,他的配置和Servlet是一样的
    • 他和Servlet本质区别是
      • 他不能产生一个请求或者响应,他只能修改某一资源的请求或者响应
    • 必须要实现javax.servlet.Filter接口,需要在web.xml中进行配置才能生效
    • Filter和特定的url关联,当用户请求访问此url时,才会触发filter调用doFilter这个方法
1.3Filter的生命周期
  • 创建
    • Filter对象在WEB服务器启动的时候,由WEB服务器帮我们创建
      • init()
  • 销毁
    • Filter对象在WEB服务器关闭的时候会被销毁
      • destory()
  • Filter的生命周期和Servlet生命周期是一样.他们都提供了init()和destory()方法 .当web服务器启动的时候,就会自动调用init()方法进行初始化,当关闭
    web服务器,关机,road整个项目的时候,就会调用destroy()方法来关闭filter
  • 总结:
    • 当web服务器启动的时候,filter就会被加载到内存,并且在调用destory()方法之前都会常驻内存
public class FilterDemo2 implements Filter { public FilterDemo2() { // TODO Auto-generated constructor stub System.out.println("FilterDemo2的构造方法执行了"); }public void destroy() { System.out.println("FilterDemo2的destory方法执行了"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("FilterDemo2的doFilter方法执行了"); chain.doFilter(request, response); }public void init(FilterConfig fConfig) throws ServletException { //这方法里面可以 获得 初始化参数 System.out.println("FilterDemo2的init方法执行了"); }}

1.4 Filter链 ??在同一个WEB应用中,可以开发编写多个Filter,那这多个Filter组成了一个链子,这个链子我们就称之为Filter链,
??WEB服务器在执行Filter链的时候,会根据Filter在web.xml文件中的配置顺序来执行。
  • 注意:
    • 多个filter对同一个资源进行处理的时候,他实际按照他在web.xml的配置顺序 从上到下 依次执行
    • 要访问最后的web资源,需要所有的filter放行,如果其中有一个没有放行,用户是无法访问最后的web资源
    • 所以filter的顺序放置需要注意 不然容易爆炸
1.5 获取Filter的初始化参数
  • 在web.xml文件中,可以通过标签来为Filter配置初始化参数,
  • WEB服务器在创建Filter对象的时候,会调用Filter对象的init方法,并且将封装了Filter初始化参数的FilterConfig对象传递进去,
  • 在Filter的init方法中,就可以通过FilterConfig对象来获取Filter的初始化参数。
配置文件
FilterDemo3 FilterDemo3 com.itheima.filter.FilterDemo3 usernamezhangsan password123456 FilterDemo3 /*

【Web|Web 基础19 Filter入门】编写初始化方法
public class FilterDemo3 implements Filter { private FilterConfig fConfig; public void destroy() { // TODO Auto-generated method stub }public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //fConfig.getInitParameter(name)chain.doFilter(request, response); }public void init(FilterConfig fConfig) throws ServletException { this.fConfig = fConfig; //获取初始化参数 /*String username = fConfig.getInitParameter("username"); String password = fConfig.getInitParameter("password"); System.out.println(username); System.out.println(password); *///获取所有的初始化参数的name Enumeration e = fConfig.getInitParameterNames(); while(e.hasMoreElements()) { String name = e.nextElement(); //System.out.println(name); String value = https://www.it610.com/article/fConfig.getInitParameter(name); System.out.println(name +"=" + value); } }}

    推荐阅读