Javaweb中的Filter过滤器

来源:互联网 发布:top100高频算法 编辑:程序博客网 时间:2024/06/05 20:24

  前边我们讲过了使用EL表达式结合标签(自定义标签和JSP标准标签库)来完成JSP中替代Java代码的开发,会极大的提高程序的可读性和维护的能力。今天我们来讲一讲Servletapi中的Filter。

  1. Filter概述

  ① Filter基本功能是对Servlet容器调用和获得响应的Servlet的过程进行拦截,从而在Servlet进行响应的前后实现一些特殊的功能。

  ② ServletAPI提供了三个API接口来供程序员开发Filter程序:Filter/FilterChain/FilterConfig

  ③ Filter因为是Servlet的API,所以也是由Servlet容器进行调用

  ④ Filter若想使用就必须在web.xml中进行注册和映射请求路径

  2.Filter的实现过程

  ① Filter不像Servlet那样除了Servlet接口之外,还有一系列的实现类供我们使用,如:GenericServlet和HttpServlet,Filter只有一个接口Filter供我们使用开发,实现这个接口之后还有三个方法要完成

  ② init(FilterConfig):和Servlet一样,这个方法也是在WEB程序加载创建了Filter实例之后立即被调用且只调用一次(单例的Filter),用来初始化当前Servlet,我们可以通过参数filterConfig获取ServletConfig和web.xml中配置的Filter名称、参数值和参数名称的Emun。

  ③ doFilter(ServletRequest , ServletResponse , FilterChain):这个方法是真正逻辑代码存在的地方,当请求匹配web.xml中配置的当前Filter的url-parttern时,这个方法才会被调用一次。需要注意的是,FilterChain这个参数是指符合同一个请求的Filter组成的链条对象,同时每一个Filter都只是将匹配的映射请求拦截下来,必须使用FilterChain.doFilter(request,response)方法将请求放行,才会将当前请求传入到下一个过滤器链中的Filter,若某个Filter是最后一个Filter,那么这个Filter放行之后去到的就是目标JSP页面。

  需要注意的是:当WEB程序被Servlet容器加载的时候,web.xml文件中的内容就会被实例化和初始化,即会先调用Servlet和Filter的无参构造器进行实例化,然后调用init(request,response,chain)方法进行初始化,当有请求匹配web.xml中的url-parttern时,那么就会调用Servlet或者Filterde的业务方法来为完成逻辑处理。

  需要注意是:我们在编写完Filter类之后,还需要在web.xml中对此过滤器进行注册和映射,且映射中的/代表的是当前WEB应用的根目录,因为这个请求直接交给了WEB服务器来处理而不是WEB浏览器。

  3.Filter的实现原理

  当在web程序中有一个Filter对Servlet进行拦截时,这个Filter就成了Servlet容器和Servlet程序间通信线路上的一个关卡。该Filter对Servlet容器发给Servlet程序的请求和Servlet程序给Servlet容器的响应进行拦截,可以决定是否将请求继续发送给Servlet程序以及是否修改请求和响应信息。需要注意的是:我们在浏览器上输入一个url进行访问时,这个Request首先是交给了Servlet容器,然后由Servlet容器来进行调用匹配url-pattern的Servlet。

  4.过滤器链

  ① FilterChain:这个对象指代了过滤器链,过滤器链就是可以映射相同的请求的Filter组成的链条对象。

  ② 处在同一个过滤器链当中的过滤器,必须调用FilterChain的doFilter(request,response)方法才可以将请求放行进入到下一个Filter中,因为Filter只是将请求拦截在了自己的doFilter(request,response,filterChain)方法中。

  ③ 一个Filter可以在web.xml中映射对个路径,一个Filter也可以在Filter链条中被调用多次。

  ④ FilterChain中的多个Filter的执行顺序

       各个Filter的init和destroy方法调用的先后无关紧要,也无法确定顺序,但是其doFilter(request,response,filterChain)方法调用的先后顺序和其在web.xml中书写的url-parttern的顺序一致。

       且在各个的doFilter(request,response,filterChain)方法中,doFilter(request,response)前的内容是按照url-parttern的顺序调用,然后到目标页面,之后再按照url-parttern的相反的顺序来调用doFilter(request,response)中的内容。

  5.Filter在web.xml中的dispacher节点

  ① 这个节点决定了Filter起作用的范围,具体来说,就是Filter根据请求到目标页面的方式来决定是否起作用。

  ② REQUEST:当直接请求到目标页面时过滤器起作用

  ③ FORWARD: 当转发到目标页面时过滤器起作用

  ④ ERROR:当以在web.xml配置error-page的方式到目标页面的方式时过滤器起作用

  ⑤ INCLUDE:当以include包含的方式到目标页面时过滤器起作用

  需要注意的是:我们可以在dispacher节点配置多个值使这个过滤器起作用,常用的是REQUEST和FORWARD

  需要注意的是:处理异常的两种方式,一是回馈到请求页面,并在其中显示域对象中的错误信息。二是在web.xml中配置error-page并制定类型,当页面出现此类型的错误时就会自动的去到错误页面。

  6.Filter的典型应用

   ① 禁用浏览器缓存:在doFilter方法中设置response的三个参数。

   ② 编写字符编码过滤器,如Spring提供的CharactoreEncodingFilter:在request.setCharactorEncoding和response.setCharactorEncoding方法中设置参数的编码方式和响应体的编码方式。

   ③ 检查访问目标页面是否需要登录的过滤器,以及检查登录后用户权限的过滤器:通过检查session对象中是否存在相应的键值对来判断是否当前用户登录了以及当前用户的权限。
























 


原创粉丝点击