手记

聊聊java过滤器是怎样使用的?

过滤器的工作原理及生命周期


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

  1. Request:用户直接访问页面时,web容器将会调用过滤器
  2. Forward:目标资源是通过RequestDispatcher的forward访问时,该过滤器将被调用
  3. Include:目标资源是通过RequestDispatcher的include访问时,该过滤器将被调用
  4. Error:目标资源时通过声明式异常处理机制调用时,过滤器将被调用
    Servlet3.0
    ASYNC:支持异步处理

@WebFilter
@WebFilter用于将一个类声明为过滤器,该注解会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。

过滤器在实际项目中的应用场景

  1. 对用户请求进行统一认证
  2. 编码转换
  3. 对用户发送的数据进行过滤替换
  4. 转换图像格式
  5. 对响应的内容进行压缩
12人推荐
随时随地看视频
慕课网APP

热门评论

好详细,赞一个��

您好,请教下,现在已经推荐在注解中配置filter信息,以前是依据web.xml中filter配置顺序,此时怎么确定过滤器链里filter的顺序?谢谢。

好详细,赞一个��

查看全部评论