Javaweb组件--Filter
今天讲的是Javaweb的三大组件之:Filter
Filter ,过滤器,主要是对web服务器管理的所有web资源,比如Jsp,Servlet,静态图片等进行拦截,从而实现一些特殊的功能。比如权限控制,请求拦截,返回内容设置。
Filter的生命周期和Servlet很类似。
当web容器启动的时候,会自动调用Init()方法来对Filter初始化
当有请求命中到某一个Filter的时候(Filter可配置命中的URL和ServletName),会调用doFilter()方法,这个方法就是过滤器的主要方法
当关闭web容器,关机,或者reload整个应用时,会调用destory()来关闭Filter
用IDEA创建一个简单的Filter来研究一下Filter
可以看到Filter接口的三个方法,分别是init()-初始化,doFilter()-过滤,destroy()-销毁。
同样的,Filter也需要配置才能生效,和Servlet一样,配置有两种方式:1、在web.xml中配置。2、用注解@WebFilter配置。具体参数如下:
就最简单的配置来作为例子:
在web.xml中配置如下
注解@WebFilter配置
需要注意的是servletNames和urlPatterns的配置,比如:urlPatterns = {"/ServletDemo2"},servletNames = {"ServletDemo"}
>> 当用户请求的是http://localhost:8080/ServletDemo2,执行的顺序是:FilterDemo init>ServletDemo2 init>ServletDemo2 service>ServletDemo2 destroy>FilterDemo destroy,也就是说其实FilterDemo的doFilter方法并没有执行
>>当用户请求的是 http://localhost:8080/ServletDemo,执行的顺序是:FilterDemo init>ServletDemo init>FilterDemo doFilter>ServletDemo service>ServletDemo destroy>FilterDemo destroy,这时候才会执行doFilter方法
在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。
如果用注解@WebFilter配置Filter,想要控制Filter的执行顺序的话,可以通过Filter的名字来控制,比如定义两个Filter,一个名字为FilterDemo1,一个FilterDemo2。执行的顺序为FilterDemo1>FilterDemo2。
FilterConfig
FilterConfig是init()方法的参数,服务器在调用init()方法的时候会吧FilterConfig对象传入。FilterConfig对象封装了Filter在web.xml中的配置信息,它对应<Filter>元素,或者是用WebFilter注解配置的信息。
包含方法:
getFilterName()->获取Servlet配置名
getServletContext()->获取ServletContext对象,即上下文对象(重点)
getInitParameter(String name)->获取初始化参数
getInitParameterNames()->获取所有初始化参数的名称
这四个方法和Servlet中的ServletConfig类似,具体可以参考文章:Javaweb组件--Servlet(后台发送消息 servlet即可)
FilterChain
web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问,否则web资源不会被访问。
也就是说,在调用doFilter方法之前可以实现你自定义的过滤器逻辑,如果需要过滤掉当前的请求,则不用调用doFilter方法,如果不用过滤掉,则调用doFilter方法。
当然,在现在类似Spring的java框架中,已经封装了很多的Filter,具体的可以看看框架的源码,受益匪浅。
可以关注微信公众号:【ITjishuzaji】 获取最新文章