过滤器链:服务器按web.xml定义的先后顺序组装成一条链
过滤器链执行过程
过滤器链执行过程
过滤器链.
过滤器链:针对一个用户的请求,找到匹配的过滤器有多个。服务器会按照web.xml中过滤器定义的先后顺序组装成一条链。
执行顺序:用户的请求到达过滤器1,执行过滤器1的Chain.doFilter放行前的代码,过滤器1放行后,请求到达过滤器2的Chain.doFilter放行前的代码,过滤器2放行后,请求到达web资源。响应数据首先,返还给过滤器2,执行过滤器2的Chain.doFilter后的代码,再执行过滤器1的Chain.doFilter后的代码,最后响应给用户。
多个过滤器的执行过程
注意:总的原则是先执行放行前的代码然后执行service方法,最后执行放行后的代码。
但是放行后的代码的执行顺序是先执行后面的过滤器的,再执行前面的过滤器
过滤器链执行顺序
如果是url-pattern不一样的,那么不存在一次请求执行多个过滤器,只会调用匹配的过滤器;
如果是url-pattern可以包含的,那么就会按web.xml中过滤器定义的先后顺序组装成一条链。
多过滤器的处理流程
过滤器链(Web项目支持多个过滤器)
定义:如果两个或者多个过滤器拦截的URL路径规则不同,则互不影响,如果相同,就构成了过滤器链。
过滤器链
过滤器链执行过程
问题:
1、Web项目中多个过滤器是如何实现的?
2、多个过滤器对应同一个用户路径执行顺序如何?
注意:过滤器的初始化方法是按照filter-name的字母排序的,排在后面的字母先加载初始化方法。
Web应用允许多个过滤器来过滤页面请求——联想现实生活中的例子是最好理解的啦!比如:为了获得更加干净的水,可能需要多个过滤器来进行过滤。 这个时候就分为两种情况了 1:多个过滤器过滤的URL不同,那么此时的多个过滤器是互不相干的,各过滤各的,互不干扰 2:多个多虑期过滤的URL相同,那么此时的多个过滤器就形成了一个过滤器链,此时就有个一个问题了Web容器现将对应的请求给谁过滤呢?处理规则也很简单,就是根据在Web.xml文件中配置的声明的顺序来决定,那个先过滤那个在过滤
过滤器链的执行过程:
用户请求-->过滤器1-->过滤器2-->servlet service-->过滤器2-->过滤器1-->用户
过滤器执行顺序
假如过滤器1和过滤器2的url-pattern是一样的,就会生成过滤器链
@JavaWeb---过滤器链执行过程
用户请求-->过滤器1-->过滤器2-->servlet service-->过滤器2-->过滤器1-->用户
@JavaWeb---过滤器链
用户请求-->过滤器1-->过滤器2-->servlet service-->过滤器2-->过滤器1-->用户
啦啦
过滤器链执行过程
过滤器链执行过程
过滤器链执行顺序:
用户请求-->过滤器1-->过滤器2-->servlet service-->过滤器2-->过滤器1-->用户
Filter可认为是Servlet的一种“变种”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。它与Servlet的区别在于:它不能直接向用户生成响应。完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
Filter有如下几个用处。
在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。
根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
Filter可负责拦截多个请求或响应;一个请求或响应也可被多个请求拦截。
创建一个Filter只需两个步骤:
创建Filter处理类(实现Filter接口).
web.xml文件中配置Filter(配置<filter>与<filter-mapping>)
每个过滤器都有它对应的<url-pattern>地址.即过滤器关联的url地址.<url-pattern>标签是<filter-mapping>下的子标签. 假如多个过滤器相关联的地址都不一样没有交集,则它们都是相互独立的.互不相干. 假如多个过滤器相关联的地址都一样.则它们便构成过滤器链.此时用户请求就会依次通过所有关联这个Web资源地址的过滤器. 过滤器链就是针对一个客户的请求,找到匹配的过滤器有多个.用户请求就会依次通过所有关联这个Web资源的过滤器.服务器会按照web.xml文件中过滤器定义的先后顺序组装成一条链.执行的顺序也是沿着这条链. 当过滤器的doFilter()方法中的chain调用doFilter(request,response)方法.符合规则则会把请求传递给下一个过滤器,下一个过滤器依次调用chain.doFilter(),直到传递到Web资源.当Web资源处理完传递过来的请求并返回响应后.此时便执行doFilter()方法放行后的方法.过滤器把响应传递给用户,从最接近Web资源的过滤器开始传递响应给用户. 假设定义过滤器的顺序为filter1、filter2、filter3.(都关联同一个web资源或Servlet) 初始化顺序(一启动服务器时加载,根据web.xml的定义过滤器的顺序初始化):filter1-->filter2-->filter3 过滤器执行顺序:cilent发送request-->filter1-->filter2-->filter3-->Web资源-->Web资源发送响应返回-->通过filter3-->filter2-->filter1-->到达client. 其中doFilter()结束顺序filter3-->filter2-->filter1.跟递归一样,因为放行是chain.doFilter(),必须当此方法执行完,即当请求去到Web资源并处理完信息返回响应后,doFilter()方法便执行放行后的语句.然后就结束. 摧毁顺序(关闭服务器):filter1-->filter2-->filter3.
同一个URL请求要经过多个过滤器时,过滤器的执行顺序按照过滤器在Web.xml中的定义顺序来执行。
过滤器链执行过程
Filter可认为是Servlet的一种“变种”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。它与Servlet的区别在于:它不能直接向用户生成响应。完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
Filter有如下几个用处。
在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。
根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
Filter可负责拦截多个请求或响应;一个请求或响应也可被多个请求拦截。
创建一个Filter只需两个步骤:
创建Filter处理类(实现Filter接口).
web.xml文件中配置Filter(配置<filter>与<filter-mapping>).
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>JavaWeb_001_fistFilter</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>FistFilter</filter-name>
<filter-class>com.filter.FistFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>FistFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
<filter>
<filter-name>SecondFilter</filter-name>
<filter-class>com.filter.SecondFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SecondFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
</web-app>
7
6