1.过滤器的概念
顾名思义就是过滤的器具,主要的作用就是过滤。让满足条件的通过,对不满足条件的进行处理。例如初中化学中的,通过漏斗加滤纸过滤干净的水,干净的水可以通过(匹配规则),但是杂质就被过滤出来了(不匹配规则),然后就是对这些杂质进行处理。是将这些杂质放到水中继续是做实验(相当于过滤器中的放行),还是倒到其他地方(相当于过滤器中的重定向到其他资源或界面)
1.1 过滤器在实际项目中的应用场景:
1.对用户请求进行统一认证
2.编码转换
3.对用户发送的数据进行过滤替换
4.转换图像格式
5.对响应的内容进行压缩
2.过滤器的工作原理
首先web容器被加载时,过滤器也随之被加载。
然后用户请求经过 过滤器,匹配过滤器的规则,如果匹配规则那么过滤器将用户请求发送到web资源,web资源处理请求,并响应给过滤器,过滤器再将web资源的响应发送给用户。
如果不匹配则进行处理则对资源进行处理,重定向或则跳转到其他资源(或者直接return;)
3.过滤器的生命周期
1.实例化:容器被加载的同时,过滤器也被实例化
2.init():进行初始化操作,加载一些资源文件等等。(只执行一次)
3.doFilter():进行过滤操作,对用户请求进行过滤,匹配规则的放行,否则进行拦截,并对请求进行处理(重定向等操作) (可以执行多次)
4.destroy():销毁操作,web容器关闭,或者web重新启动时执行。主要对资源进行释放。(只执行一次)
4.过滤器在web中配置
<filter>
<filter-name>Filter</filter-name>
<filter-class>com.abc.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter</filter-name> //filtername必须和上面的filtername相同
<url-pattern>/*</url-pattern>(/*表示对于任意请求)
</filter-mapping>
5.过滤器链
执行顺序:
按照过滤器在web.xml文件中注册时的顺序,先注册的先执行。
如有版权问题,请在下方留言告知我,谢谢!
执行原理:
web容器根据Filter在web.xml文件的注册顺序执行,当执行第一个Filter的doFilter(), web服务器会创建一个FilterChain代表Filter链并传递给doFilter方法。在doFilter方法中,如果开发人员调用了FilterChain的doFilter方法,则FilterChain会检测是否有下一个Filter,如果有则将请求传递到下一个Filter。如果没有 则 请求到达web资源处
6.过滤器过滤类型选择:
过滤器默认过滤的类型是:request。要想过滤其它的需要在web.xml中配置
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>*.action</url-pattern>
<dispatcher>REQUEST</dispatcher> //对request过滤
<dispatcher>FORWARD</dispatcher> //对forward过滤
<dispatcher>INCLUDE</dispatcher> //对include过滤
<dispatcher>ERROR</dispatcher> //对errort过滤
</filter-mapping>
7.过滤器的异步实现
<filter-mapping>的特殊参数-dispatcher:
此参数根据配置不同,支持不同类型的请求,可配置多个。
REQUEST(默认值):从客户端直接请求过来会走这个过滤器,直接请求或redirect.sendRedirect("url");。
FORWEARD:通过dispatcher的forward方法会走这个过滤器。request.getdispatcher("url").forward(request,response);或使用jsp指令 jsp:forward。
INCLUDE:通过dispatcher的include()方法会走这个过滤器。request.getdispatcher("url").include(request,response);或使用jsp指令 jspinclude。
ERROR:通过web.xml中<error-page>过来的请求会走这个过滤器。
ASYNC(Servlet3.0添加了对另一种值的支持:异步处理)。原有的servlet需要处理完业务逻辑再相应,现在会开启另外一个线程单独处理业务逻辑,servlet线程委托其他线程处理业务逻辑,自己在不生成响应的情况下返回至容器,提高并发访问速度,减少服务器资源的占用。
Servlet3.0增加了对注解的支持,可以通过注解配置,不用在web.xml中配置。需要配合支持Tomcat7.0以上容器(支持servlet3.0)。
详细的讲解请看:https://www.cnblogs.com/douJiangYouTiao888/p/6473936.html