Filter
Posted Actexpler
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Filter相关的知识,希望对你有一定的参考价值。
Filter
先把Filter的基础知识绘制成思维导图的形式,便于记忆
一、Filter简介:
Filter又称为过滤器,就是实现浏览器与服务器之间的过滤问题,作用是在浏览器的请求在到达WEB资源(html、CSS、Servlet、JSP)之前进行拦截。然后能够进行一些操作:例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
Filter 的作用:
二、Filter的实现原理
也就是Filter是怎么实现拦截的?
因为Filter是实现Filter接口,而该接口会提供一个doFilter方法;当创建好Filter类后,实现doFilter方法,在web-xml文件中部署好Filter后,每当浏览器向服务器发送请求时,在调用service方法之前都会执行doFilter方法,这时候就可以对网页进行一些过滤和其他的操作;也就是说Filter就像一个门口的保安一样,在你进入小区之前会核实你的身份,如果允许进入就同行,不是本小区的陌生人,就可能让你先登个记在让你进(同行前进行一些操作),出来的时候可能还需要在登个记(放行之后的操作),如果是黑名单上的人就不允许进入。
这就是Filter的功能(在doFilter中实现):
访问目标资源前进行一些操作
是否允许调用目标资源(是否放行)
调用目标资源后的一些操作
三、Filter类的创建
3.1使用Filter的步骤
1.编写Java类实现Filter接口,并实现doFilter方法;
2.在web-xml文件中进行配置
1).Java的实现范例
public class myFilter implements Filter{ @Override public void init(FilterConfig arg0) throws ServletException {//初始化方法 System.out.println("init初始化"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //doFilter方法 System.out.println("放行前"); System.out.println("doFilter"); chain.doFilter(request, response);//放行 System.out.println("放行后"); } @Override public void destroy() {//销毁方法 System.out.println("destroy销毁"); } }
2)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>web-filter</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 注册过滤器 --> <filter> <!-- 注册过滤器的名,程序员在程序中使用 --> <filter-name>myFilter</filter-name> <!-- 配置类,给程序使用,程序识别class类 --> <filter-class>com.deuedu.filter.myFilter</filter-class> </filter> <!-- 映射过滤器 --> <filter-mapping> <!-- 映射过滤器,能够通过这个找到注册过滤器名,所以这两个名要一致 --> <filter-name>myFilter</filter-name> <!-- 拦截的请求 --> <url-pattern>/1.jsp</url-pattern> </filter-mapping> </web-app>
四、Filter的部署
就是上述在web-xml进行配置的过程,两步:1是注册Filter,2是映射Filter
1)、注册Filter
<!-- 注册过滤器 --> <filter> <!-- 注册过滤器的名,程序员在程序中使用 --> <filter-name>myFilter</filter-name> <!-- 配置类,给程序使用,程序识别class类 --> <filter-class>com.deuedu.filter.myFilter</filter-class> </filter>
当然可以在注册的时候添加参数,通过init-param来实现
<!-- 注册过滤器 --> <filter> <!-- 注册过滤器的名,程序员在程序中使用 --> <filter-name>myFilter</filter-name> <!-- 配置类,给程序使用,程序识别class类 --> <filter-class>com.deuedu.filter.myFilter</filter-class> <init-param> 7 <description>初始化参数</description> 8 <param-name>name</param-name> 9 <param-value>孙悟空</param-value> 10 </init-param> </filter>
<description>用于添加描述信息,该元素的内容可为空,<description>可以不配置。
<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
<filter-class>元素用于指定过滤器的完整的限定类名。
<init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。如果过滤器不需要指定初始化参数,那么<init-param>元素可以不配置。
2)映射Filter
<!-- 映射过滤器 --> <filter-mapping> <!-- 映射过滤器,能够通过这个找到注册过滤器名,所以这两个名要一致 --> <filter-name>myFilter</filter-name> <!-- 拦截的请求 --> <url-pattern>/1.jsp</url-pattern> </filter-mapping>
<filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
<filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
<url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
<servlet-name>指定过滤器所拦截的Servlet名称。
<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。
- REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
- INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
- FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
- ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用
3)
url-pattern的设置规则
五、Filter生命周期
1.Filter的创建
Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次(单例模式),init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
2、Filter的销毁
Web容器调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。
六、Filter链
在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。
以上是关于Filter的主要内容,如果未能解决你的问题,请参考以下文章
php代码片段: sendFile/videoStream/sendEmail/phpexcel/ffmpeg/zip
text 此片段用于以下知识库文章 - http://kb.wpbeaverbuilder.com/article/591-create-a-filter-to-customize-the-di