初步认识Filter过滤器
- 它的定义是在请求一个资源或者从一个资源返回信息的时候执行过滤操作的插件
- Filters是在web.xml中配置的插件,Servlets和Filters相互没有依赖,如果通过编辑web.xml来添加和删除过滤器。实现过滤器非常简单,只需要实现javax.servlet.Filter接口,就可以实现一个过滤器。
通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,一般常用于实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
小知识:Servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。(如果你不认识Servlet,那么可以直接将Servlet看成是asp .net里的Controller控制器)
Filter实现功能
- 统一POST请求中文字符编码的过滤器
- 控制浏览器缓存页面中的静态资源的过滤器
- 使用Filter实现URL级别的权限认证
- 实现用户自动登陆
Filter接口
javax.servlet.Filter这个接口提供了3个方法,在服务器调用doFilter方法时,会传递filterChain对象进服务端,filterChain是Filter接口中很重要的一个对象。
这个对象它也提供了doFilter方法,我们可以根据需求决定是否调用,如调用,则web服务器就会调用web资源的service方法,即web资源就会被访问,否则web资源不会被访问。利用它可以在调用目标资源之后,让一段代码执行。
当我们编写好Filter,配置好对哪个资源进行过滤后,WEB服务器每次在调用web资源之前,都会先调用一下filter的doFilter方法。
//该方法在客户端请求及服务器端回复时都将被自动调用
public void doFilter (ServletRequest, ServletResponse, FilterChain)
//初始化配置参数,在doFilter()方法之前被调用
public void init(FilterConfig filterConfig)
//结束过滤器,doFilter()方法完成后被调用
public void destroy()
如下是Filter过滤器的原理图


在客户向服务端发起请求时,Filter会横在Servlet、jsp、html跟客户的连接通道之间,从而达到过滤的效果。
在过滤器中的我们可以执行一段代码,这段代码是很有意义的,以此可以提高网站的安全性
Filter的配置
<web-app>
<filter>
<filter-name>testFitler</filter-name> <!-- 过滤器名称 -->
<filter-class>org.test.TestFiter<!-- 路径指定对哪个Servlet --></filter-class>
<init-param>
<param-name>word_file</param-name>
<param-value>/WEB-INF/word.txt<!-- 路径指定对哪个资源文件 --></param-value>
</init-param>
</filter>
</web-app>
filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前。
它包含如下三个可能的子元素:
-
filter-name 这个必需的元素必须与用filter元素声明时给予过滤器的名称相匹配。
-
url-pattern 此元素声明一个以斜杠(/)开始的模式,它指定过滤器应用的URL。所有filter-mapping元素中必须提供 url-pattern或servlet-name。但不能对单个filter-mapping元素提供多个url-pattern元素项。如果希望过滤 器适用于多个模式,可重复整个filter-mapping元素。
-
servlet-name 此元素给出一个名称,此名称必须与利用servlet元素给予servlet或JSP页面的名称相匹配。不能给单个 filter-mapping元素提供多个servlet-name元素项。如果希望过滤器适合于多个servlet名,可重复这个filter-mapping元素。
对于路径,当我们想要过滤的元素过多时,一个个配置太麻烦,可以用 ‘ * ’ 号,进行代替,例:
<web-app>
<filter>
<filter-name>testFitler</filter-name> <!-- 过滤器名称 -->
<filter-class>*<!-- * 针对于所有的Servlet --></filter-class>
<init-param>
<param-name>word_file</param-name>
<param-value>*<!-- * 针对于所有的资源文件 --></param-value>
</init-param>
</filter>
</web-app>
这样在进入服务端,进行资源调用时,都会经过该过滤器,要是有一两个不想执行过滤器中的代码,给个if吧
Filter的生命周期
1. 加载和实例化
- Web 容器启动时,即会根据 web.xml 中声明的 filter 顺序依次实例化这些 filter。
2. 初始化
-
Web 容器调用 init(FilterConfig) 来初始化过滤器。容器在调用该方法时,向过滤器传递 FilterConfig 对象,FilterConfig 的用法和 ServletConfig 类似。
-
利用 FilterConfig 对象可以得到 ServletContext 对象,以及在 web.xml 中配置的过滤器的初始化参数。在这个方法中,可以抛出 ServletException 异常,通知容器该过滤器不能正常工作。
-
此时的 Web 容器启动失败,整个应用程序不能够被访问。实例化和初始化的操作只会在容器启动时执行,而且只会执行一次。
3. doFilter
-
doFilter 方法类似于 Servlet 接口的 service 方法。当客户端请求目标资源的时候,容器会筛选出符合 filter-mapping 中的 url-pattern 的 filter,并按照声明 filter-mapping 的顺序依次调用这些 filter 的 doFilter 方法。
-
在这个链式调用过程中,可以调用 chain.doFilter(ServletRequest, ServletResponse) 将请求传给下一个过滤器(或目标资源),也可以直接向客户端返回响应信息,或者利用 RequestDispatcher 的 forward 和 include 方法,以及 HttpServletResponse 的 sendRedirect 方法将请求转向到其它资源。
-
需要注意的是,这个方法的请求和响应参数的类型是 ServletRequest 和 ServletResponse,也就是说,过滤器的使用并不依赖于具体的协议。
4. 销毁
- Web 容器调用 destroy 方法指示过滤器的生命周期结束。在这个方法中,可以释放过滤器使用的资源。
总结
对于Filter过滤器,我们可以在过滤器中,过滤掉一些低俗文字,危险字符,也可以针对传输Servlet的参数进行修改,因为过滤器的机制就摆在那。
针对于某个资源文件进行使用都会经过过滤器,在过滤器中,虽然是一小块代码,但是这一小段代码对于Web开发是具有非常意义的。
2096

被折叠的 条评论
为什么被折叠?



