JavaWeb三大组件之过滤器-Filter

1.Filter过滤器

Filter过滤器是javaEE的规范,是接口(javax.servlet Interface Filter)

 2.过滤器作用-

拦截请求,过滤响应

情景引入:浏览器访问tomcat的login页面,进行登录验证,保存session,之后再对具体的资源进行访问

if 浏览器不讲武德,直接去访问资源,怎么办?在资源上获取session进行验证用户是否登录,如果资源有很多,那么每个都要进行验证---代码冗余,管理复杂,怎么办?

使用过滤器统一验证(身份验证,权限检查,日志操作,事务管理)

3.过滤器原理

浏览器---http请求

          ↓

服务器(tomcat)<在web.xml文件中由程序员进行过滤条件的设置,符合条件的进行过滤,不符合的直接放行>

    <!--filter一般写在servlet前面-->
    <!--<url-pattern>/manage/*</url-pattern>
    表示当你去访问这个路径下的资源时候,就会调用这个Filter进行过滤
    /manage/*中第一个/会由服务器来解析,解析成http://localhost:8080(ip:port)/工程路径-->
    <filter>
        <filter-name>ManageFilter</filter-name>
        <filter-class>com.zitWang.filter.ManageFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>ManageFilter</filter-name>
        <url-pattern>/manager/*</url-pattern>
    </filter-mapping>

        ↓

filter过滤器   →<失败就返回>

        ↓<合法就允许访问资源>

    资源

4.Filter配置Url-Pattern规则

url-pattern设置Filter的拦截路径,拦截时,只关心是否匹配,不关心请求的资源是否真的存在

匹配:

5.Filter生命周期

5.1创建:web工程启动,执行构造器与init方法,生成一个ManagerFilter实例常驻内存(一个filter,一次init()方法发的调用)

5.2活动:http请求到了tomcat服务器时,<url-pattern>匹配上了,执行doFilter();进行拦截


浏览器的地址栏:http://localhost:8080/工程路径/manager/xxxx资源
与<url-pattern>/manager/*</url-pattern>匹配上了

调用时候tomcat创建(ServletRequest,ServletResponse ,FilterChain三个对象),并且通过doFilter传入,在同一次请求中,ServletRequest,ServletResponse分别与之后使用的Request,Response是同一个对象。

5.3销毁:停止web工程时,调用destroy();销毁Filter实例

6.FilterConfig

filterConfig在创建filter时一并创建,通过init()方法传入,filterConfig包含filter的配置文件的配置信息

7.FilterChain过滤器链

一次请求,一个线程中,多个过滤器层层把关,筛选拦截

filterChain.doFilter(servletRequest,servletResponse);

在一个过滤器的doFilter方法中执行filterChain.doFilter(servletRequest,servletResponse);表示执行下一个过滤器的doFilter方法,如果没有下一个过滤器,则表示这个过滤器放行,此时会访问目标资源。

FilterChain过滤器链:一次http请求的多层过滤

一个过滤器的doFilter方法中有:(前置代码)+(filterChain.doFilter)+(后置代码)

当有多个过滤器执行过滤器链的时候:请求顺序按照web.xml文件中filter的配置顺序执行,具体执行顺序如下:

例子:a过滤器:(前置代码AAA)+(a的filterChain.doFilter)+(后置代码aaa)

          b过滤器:(前置代码BBB)+(b的filterChain.doFilter)+(后置代码bbb)

顺序:AAA →a的filterChain.doFilter →前置代码BBB →b的filterChain.doFilter →请求到了目标资源→执行后置代码bbb → 执行后置代码aaa

 

posted @ 2023-01-08 23:24  ZitWang  阅读(241)  评论(0编辑  收藏  举报