servlet 和 filter执行顺序
来源:互联网 发布:全世界讨厌中国人知乎 编辑:程序博客网 时间:2024/06/05 04:45
在我们写代码时,在web.xml中总能发现类似下面的代码:
这个web.xml就涉及到了filter与servlet,那么他们两个有什么区别与联系呢?
1. Filter
实现javax.servlet.Filter接口,在web.xml中配置与标签指定使用哪个Filter实现类过滤哪些URL链接。只在web启动时进行初始化操作。
filter 流程是线性的, url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等,而servlet 处理之后,不会继续向下传递。filter功能可用来保持流程继续按照原来的方式进行下去,或者主导流程,而servlet的功能主要用来主导流程。
在filter接口要实现三个方法:init(),destroy(),dofilter();分别是初始化,析构,和过滤,其中大部分时间花费在doFilter()方法上
特点:可以在响应之前修改Request和Response的头部,只能转发请求,不能直接发出响应。filter可用来进行字符编码的过滤,检测用户是否登陆的过滤,禁止页面缓存等
1).filter的init方法在容器初始化时加载。第一次加载容器执行顺序随机,以后再次加载顺序以第一次加载顺序为准。
2).filter的doFilter方法在请求url时执行,如果有多个filter匹配,则按照<filter-mapping>顺序执行(前提是doFilter方法里面最后要调用FilterChain的doFilter方法,这个方法作用是继续执行下个filter,如果没有加,则不执行下面的filter)
2. Servlet
servlet 流程是短的,url传来之后,就对其进行处理,之后返回或转向到某一自己指定的页面。它主要用来在业务处理之前进行控制。
servlet继承与servlet接口,实现方法:init(),service(),destroy(),getServletConfig(),getServletInfo()方法。在调用时service方法时会根据请求方式调用doget()或者dopost()方法;
serlvet的init方法
1).如果web.xml中配置了<load-on-startup>属性,则在Tomcat初始化时按其值从小到大的顺序加载所有servlet的init方法。
2).如果没有配置<load-on-startup>属性,容器初始化时不加载。在请求匹配的url时进行加载,并且只加载最后一个servlet的init方法。其他的servlet不加载。
3).servlet的doGet、doPost方法:在请求匹配的url路径时加载,而且只加载最后一个servlet的方法,其他方法不加载。
filter和servlet同时存在,且容器初始化都要加载,则先加载filter再加载servlet的init方法。
如果请求的url既匹配filter又匹配servlet,并且servlet的init方法没有在容器初始化加载,则先加载匹配的servlet的最后一个servlet的init方法,再按顺序执行filter方法,最后再执行匹配的最后一个servlet方法
在网上看到一张图与大家分享:
Filter
Servlet
接口
实现Filter接口
实现Servlet接口
使用步骤
1、创建类,继承接口
2、实现方法
init()
doFilter()
destroy()
3、配置WEB-INF/web.xml
1、创建类,继承接口
2、实现方法
init()
service()
destroy()
getServletConfig()
getServletInfo()
3、配置WEB-INF/web.xml
初始化时间
Servlet容器启动之后即初始化
Servlet类被调用之后初始化、先于Filter调用。
初始化可以在容器启动后被调用但需要配置。
调用顺序
1. 按照web.xml中的映射配置顺序按照配置条件从后向前调用
2. 层次调用doFilter()方法中FilterChain.doFilter()之前的内容
3. 调用Servlet中的service()方法
4. service方法执行完毕后,层次调用doFilter()中FilterChain.doFilter()之后的方法,顺序与之前的相反
按照web.xml中的映射配置顺序按照配置条件从后向前调用第一个满足条件的Servlet,调用之前事先执行满足条件的Filter,不存在层次调用Servlet问题
销毁
服务器停止后销毁,晚于Servlet销毁之后
服务器停止后销毁
作用
1. 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。
2. 根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
3. 在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
4. 根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
主要是处理客户端的请求并将其结果发送到客户端。
filter的初始化是在servlet容器启动时,而Servlet类被调用之后初始化、先于Filter调用。初始化可以在容器启动后被调用但需要配置。(filter的初始化根据在web.xml中filter的声明顺序,注意filtermapping必须放在filter声明之后使用。servlet被调用初始化,先于filter调用,是指chain.fiter(),service(),chainfiter()之后的代码)
调用顺序:filter的调用顺序:
1. 按照web.xml中的映射配置顺序按照配置条件从后向前调用
2. 层次调用doFilter()方法中FilterChain.doFilter()之前的内容(filter-mapping的name先调用doFilter方法,但是每个dofilter方法的内部存在chain.dofilter会调用下一个filter-mapping,一直到不存在下一个filter后在返回,执行chain.dofilter()后面的代码)(相当于递归调用)
3. 调用Servlet中的service()方法
4. service方法执行完毕后,层次调用doFilter()中FilterChain.doFilter()之后的方法,顺序与之前的相反
servlet的调用顺序:
按照web.xml中的映射配置顺序按照配置条件从后向前调用第一个满足条件的Servlet,调用之前事先执行满足条件的Filter,不存在层次调用Servlet问题
当然咱们通俗易懂的来讲,filter就是用来拦截进行一些日志类似aop的功能,而servlet就是转发到别的页面。filter我们可以不配置也就不用,但是目前所有代码基本上都配置了servlet。- servlet 和 filter执行顺序
- Listener,Filter,Servlet执行顺序和生命周期
- Filter、Servlet和Interceptor的执行顺序
- Listener,Filter,Servlet执行顺序和生命周期
- 探究Servlet Filter 执行顺序
- Tomcat的valve、filter和servlet的执行顺序
- Filter和Servlet的执行顺序与实例
- ServletContext,Listener,Filter和自启动Servlet的执行顺序
- servlet 和filter区别和servlet、filter、interceptor的执行顺序
- [转]servlet 和filter区别和servlet、filter、interceptor的执行顺序
- servlet 和filter区别和servlet、filter、interceptor的执行顺序
- Servlet 中 Filter的执行顺序
- [转]filter、servlet、interceptor的执行顺序
- Servlet中filter的执行顺序以及urlPatterns和servletNames之间的关系
- servlet:servlet的执行顺序和生命周期
- Servlet中listener、filter执行顺序及相关介绍
- Web.xml中 listener、filter、servlet 执行顺序
- servlet、filter 顺序
- linux 查看系统信息相关命令
- .gradle目录组织
- Cache注解详解
- studio3.0Butterknife使用及报错解决
- Java中的transient关键字
- servlet 和 filter执行顺序
- 深入理解Java垃圾回收机制
- 生成器方法Symbol.iterator
- 远程连接MYSQL提示Host is not allowed to connect to this MySQL server
- 关于拷贝文件后的权限问题
- selenium的下载地址
- cocos creator 系统事件监听方法
- 头像上传代码
- 【我的Java笔记】多线程安全问题 & 同步机制