今天来写写关于web技术中的一个入门级的--Filter过滤器的使用,方便以后开发使用,不然这种纯技术类的不多敲的话,真的很容易忘掉的。。。
Filter 来源 -- 有时候开发中会遇到重复代码的实现,就比如每一次都要写入servlet的转码代码,其次对于登陆的用户才会有的相应权限的逻辑等等,就需要过滤器来过滤掉一些我们不需要的东西和操作...
Filter 实现原理--首先FIlter是JDK里面就自带的一个接口,所以我们自定义的Filter只需要继承这个接口,并且实现其所有的方法就行,因而也容易想到,它跟servlet一样,只要服务器开启,Filter内部的init方法就会被服务器执行,来创建一个Filter实例,然后就是我们可以自定义的doFilter方法的来解决事物逻辑的问题,最后一个就是destroy的方法,也是随着服务器的停止才会执行。
Filter 使用步骤
1. 在你的工程目录下定义一个Filter类来继承Filter接口,下面我都用实现登陆代码需要使用过滤器来转码,而不是再次写入转码代码的例子,我定义的是EncodingFilter的类,继承Filter接口,你的IDE会立马显示红线,提醒你要实现的虚方法们,init(),前面说过,是服务器一开始就会执行的方法,在这里可以得到一些你定义的Filter的配置信息,这些信息的配置和在哪配置见第二步骤,来说init方法的参数,filterConfig这很明显就是配置参数的一个实体类,在这里面你可以得到初始的参数,反正这种得到配置参数及其值的方法千篇一律,都是那几种,我写一个可以得到所有的,并以枚举的方式列出的代码:
@Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub Enumeration<String> enums = filterConfig.getInitParameterNames(); while(enums.hasMoreElements()){ System.out.println("[ encodingFilter params have : "+enums.nextElement()+" : "+filterConfig.getInitParameter(enums.nextElement())); } }
然后就是doFilter方法,这个是重点后面单讲,最后一个destory,这就没什么好说的了
2. 既然类已经创建好了,现在就是配置信息的设置,在你的web工程目录下面找到web.xml也就是每次回配置servlet的那个文件,里面写入filter的配置信息,直接看示例吧:
<!-- encodingFilter set --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>filterCases.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>path</param-name> <param-value>c:/...</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/LoginServlet</url-pattern> </filter-mapping>
<filter-name>是你可以自定义给你的Filter的名字,但最好是通俗易懂;
然后是<filter-class>这个是你自定义的Filter类的全限名称,也就是你的包名+类名,这样服务器才能加载到你的类文件,这个不能错;
<init-param>就是初始化的参数列表了,这里面主要是以key-value的形式出现的,也是你可以让服务器去执行的事物参数,比如我这里就定义的是转码的事物参数,定义了filter之后,就需要定义filter-map,里面主要是处理filter的转向的一些逻辑问题的,首先指定filter-name,这个跟你上面定义的那个name要一样,然后是<url-pattern>这里面可以写几种形式 :(1)/* 这种是对所有资源都会进行拦截,也就是都会执行filter的dofilter的方法的, (2)/ixxxx.jsp 这种是对指定的jsp进行拦截,也就是每次在请求这个jsp的前面都会先执行一次dofilter的方法, (3)*.jsp这个是对所有的jsp进行拦截, (4)/xxx 这个没有后缀名的,就是默认对指定的servlet进行拦截 ,同时还有一种就拦截servlet的方式<servlet-name>IndexServlet</servlet-name>根据servlet的内部名称拦截;
<dispatcher> 这格式指定拦截的类型 :
默认拦截的类型:(直接访问或者重定向)
<dispatcher>REQUEST</dispatcher>
拦截转发:
<dispatcher>FORWARD</dispatcher>
拦截包含的页面(RequestDispatcher.include(/page.jsp); 对page.jsp也执行拦截)
<dispatcher>INCLUDE</dispatcher>
拦截声明式异常信息:
<dispatcher>ERROR</dispatcher>
3.重点讲讲这个dofilter的方法内容,首先从参数讲起,很明显,这里会有request和response的参数,主要来源于将要请求访问的资源和要求,这个毋庸置疑,因为这个是在servlet执行只要要执行的嘛,最核心的是这个filterChain,过滤器链,为什么要叫它链呢,因为它有一个方法是filterChain.doFilter(),一看,怎么又是执行这个方法,感觉像是递归,其实这个就是在放行,将你的这个request请求通过我的过滤后再放给下一个定义的过滤器去执行它的doFilter方法,那这个执行顺序是怎么来的呢,就根据你在配置里面的执行顺序来的,然后当所有的过滤器都执行完了就会将request给你要转到的servlet去,所以是必须要写的一个步骤,不然你请求的任何资源信息都显示不出来,因为资源都会被拦截的。