Filter详解

Posted 剪水行舟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Filter详解相关的知识,希望对你有一定的参考价值。

Filter简介

通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。

三个方法

//设置filter 的配置对象;
void setFilterConfig(FilterConfig config) 
//返回filter的配置对象;
FilterConfig getFilterConfig() 
//执行filter的工作
void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) 
//配置拦截路径
@WebFilter("/*")

Filter实现拦截的原理

Filter接口中有一个doFilter方法,当开发人员编写好Filter类实现doFilter方法,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前(服务器内部对资源的访问机制决定的),都会先调用一下filter的doFilter方法。

  1. 调用目标资源之前,让一段代码执行。
  2. 是否调用目标资源(即是否让用户访问web资源)。
  3. 调用目标资源之后,让一段代码执行。

image

创建Filter

xml方式

    <filter>
        <!-- 过滤器名称  -->
        <filter-name>hello_filter</filter-name>
        <!-- 过滤器对应的实现类  -->
        <filter-class>cn.itcast.a_filter_hello.HelloFilter</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>hello_filter</filter-name>
        
        <!-- 过滤器过滤模式,/* 表示过滤所有资源    -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

--------------------------------------------------------------------------------------------
    <filter>
        <!-- 过滤器名称  -->
        <filter-name>hello_filter</filter-name>
        <!-- 过滤器对应的实现类  -->
        <filter-class>cn.itcast.a_filter_hello.HelloFilter</filter-class>  
   </filter>
    <filter-mapping>
        <filter-name>hello_filter</filter-name>
        <!-- 过滤器过滤模式,/* 表示过滤所有资源    -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

注解方式

@WebFilter(filterName = "Filterewrt",urlPatterns = {"/"})
public class Filterewrt implements Filter {
    
}

image

Filter生命周期

和Servlet一样,Filter的创建和销毁也是由WEB服务器负责。

与Servlet区别的是

1>在应用启动的时候就进行装载Filter类而servlet是在请求时才创建(但filter与Servlet的load-on-startup配置效果相同)。

2>容器创建好Filter对象实例后,调用init()方法。接着被Web容器保存进应用级的集合容器中去了等待着,用户访问资源。

3>当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。

4>当应用服务被停止或重新装载了,则会执行Filter的destroy方法,Filter对象销毁

总结:

对于filter的应用相信大家已经明白了,它主要的作用就是用户在访问某个目标资源之前,对访问的请求和响应进行拦截,做一些处理,然后再调用目标程序,这样做的好处是可以对一些公共的操作进行抽象,就拿设置字符集来说,如果不使用这种方式,我们每个页面都要写设置字符集的语句。不但麻烦而且维护困难,但是如果使用filter的话,只需要添加一个类,在xml中配置一下,如果不想使用了,将配置文件中的内容去除即可。

其实这就是一种AOP(Aspect OrientedProgramming),面向切面编程。它的主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

对于设置字符集来说,它并非是业务逻辑的内容,对于这些内容的处理我们就可以提取出来,使用filter进行整体设置,这种方式相当于对类中的内容做进一步的抽象,使我们的系统更加灵活,更加能应对变化!

以上是关于Filter详解的主要内容,如果未能解决你的问题,请参考以下文章

springboot扫描自定义的servlet和filter代码详解_java - JAVA

SpringCloud06_Gateway的概述工程案例代码微服务动态路由Predicate的使用详解Filter(建议收藏)

(转) Java中的负数及基本类型的转型详解

详解Android WebView加载html片段

JS常用代码片段2-值得收藏

JS常用代码片段2-值得收藏