过滤器的工作原理及生命周期
init():这是过滤器的初始化方法,web容器创建过滤器实例后将调用这个方法。这个方法中可以读取web.xml文件中过滤器的参数。
doFilter():这个方法完成实际的过滤操作。这个地方是过滤器的核心方法。当用户请求访问与过滤器关联的URL时,Web容器将先调用过滤器的doFilter方法。FilterChain参数可以调用chain.doFilter方法,将请求传给下一个过滤器(或目标资源),或利用转发,重定向将请求转发到其他资源。
destroy():web容器在销毁过滤器实例前调用该方法,在这个方法中可以释放过滤器占用的资源。(大多数情况用不到)
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>FilterTest</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>FirstFilter</filter-name>
<filter-class>com.filter.FirstFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
过滤器链
过滤器1 ,过滤器2
若他们的url-pattern不一样,则是互不干扰的两个过滤器
若他们的url-parttern一样,则形成了过滤器链
用户请求——》过滤器1——》过滤器2——》过滤器3——》web资源
服务器会按照web.xml中过滤器定义的先后顺序组装成一条链
过滤器链执行过程
eg:
start----doFilter--FirstFilter
start---doFilter--SecondFilter
index.jsp
end---doFilter--SecondFilter
end------doFilter—FirstFilter
过滤器的分类
Servlet2.5
- Request:用户直接访问页面时,web容器将会调用过滤器
- Forward:目标资源是通过RequestDispatcher的forward访问时,该过滤器将被调用
- Include:目标资源是通过RequestDispatcher的include访问时,该过滤器将被调用
- Error:目标资源时通过声明式异常处理机制调用时,过滤器将被调用
Servlet3.0
ASYNC:支持异步处理
@WebFilter
@WebFilter用于将一个类声明为过滤器,该注解会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。
过滤器在实际项目中的应用场景
- 对用户请求进行统一认证
- 编码转换
- 对用户发送的数据进行过滤替换
- 转换图像格式
- 对响应的内容进行压缩
热门评论
好详细,赞一个
您好,请教下,现在已经推荐在注解中配置filter信息,以前是依据web.xml中filter配置顺序,此时怎么确定过滤器链里filter的顺序?谢谢。
好详细,赞一个