过滤器(Filter)
- Filter的基本功能是对servlet容器调用servlet的过程进行拦截,从而在servlet进行相应处理的前后实现一些特殊的功能。
- 在servlet API中定义了三个接口类供开发人员编写Filter程序:Filter、FilterChain、FilterConfig。
- Filter程序是一个实现了Filter接口的Java类,与servlet程序相似,它由servlet容器进行调用和执行。
- Filter程序需要在web.xml文件中进行注册和设置它所能拦截的资源:Filter程序可以拦截JSP、servlet、静态图片文件和静态HTML文件。
Filter的基本工作原理
- 当在web.xml中注册了一个Filter来对某个servlet程序进行拦截处理时,这个Filter就成了servlet容器与该servlet程序的通信线路上的一道关卡,该Filter可以对servlet容器发送给servlet程序的请求和servlet程序回送给servlet容器的响应进行拦截,可以决定是否将请求继续传递给servlet程序,以及对请求和响应信息是否进行修改。
- 在一个web应用程序中可以注册多个Filter程序,每个Filter程序都可以对一个或一组servlet程序进行拦截。
- 若有多个Filter程序对某个servlet程序的访问过程进行拦截,当针对该servlet的访问请求到达时,web容器将把这多个Filter程序组合成一个Filter链(过滤器链)。Filter链中的各个Filter的拦截顺序与它们在应用程序的web.xml中映射的顺序一致。
Filter接口
- 在web应用程序启动时,web服务器将根据web.xml文件中的配置信息来创建每个注册的Filter实例对象,并将其保存在服务器的内存中。
- web容器创建Filter对象实例后,将立即调用该Filter对象的init方法。init方法在Filter生命周期中仅执行一次。
- web容器在调用init方法时,会传递一个包含Filter配置和运行环境的FilterConfig对象(FilterConfig的用法和ServletConfig类似)。
- 利用FilterConfig对象可以得到ServletContext对象,以及配置的过滤器的初始化参数。
- 在这个方法中,可以抛出ServletException异常,通知容器该过滤器不能正常工作。
- destory():在web容器卸载Filter对象之前被调用。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。
- 与开发servlet不同的是,Filter接口并没有相应的实现类可供继承,要开发过滤器,只能直接实现Filter接口。
- doFilter()方法类似于Servlet接口中的service方法。当客户端请求目标资源的时候,容器就会调用与这个目标资源相关联的过滤器的doFilter()方法。
- 其中参数request、response为web容器或Filter链的上一个Filter传递过来的请求和响应对象。
FilterChain接口
- FilterChain接口:代表当前Filter链的对象。由容器实现,容器将其实例作为参数传入过滤器对象的doFilter()方法中。过滤器对象使用FilterChain对象调用过滤器链中的下一个过滤器,如果该过滤器是链中的最后一个过滤器,那么将调用目标资源。
- doFilter(ServletServletRequest request,ServletResponse response) throws java.io.IOException:调用该方法使过滤器链中的下一个过滤器被调用。如果是最后一个过滤器,会调用目标资源。
FilterConfig接口
- javax.servlet.FilterConfig接口:该接口类似于ServletConfig接口,由容器实现。servlet规范将代表ServletContext对象和Filter的配置参数信息都封装在该对象中。servlet容器将其作为参数传入过滤器对象的init()方法中。
- String getFilterName():得到描述符中指定的过滤器的名字。
- String getInitParaParameter(String name):返回在部署描述中指定的名字为name的初始化参数的值。如果不存在返回null。
- Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
- public ServletContext getServletContext():返回servlet上下文对象的引用。
过滤器的部署
在实现一个过滤器后,要在web.xml中进行注册和设置它所能拦截的资源。这可以通过filter和filter-mapping元素来完成。
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.hpe.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- filter-name子元素用于设置filter的注册名称。该值必须是在filter元素中声明过的过滤器的名字。
- url-pattern设置filter所拦截的请求路径
监听器
专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。
servlet监听器
servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
按监听的事件类型Servlet监听器可分为三种类型:
- 监听域对象自身的创建和销毁的事件监听器。
- 监听域对象中的属性的增加和删除的事件监听器。
- 监听绑定到域中的某个对象的状态的事件监听器。
监听器
- servlet规范为每种事件监听器都定义了相应的接口,开发人员编写的事件监听器程序只需实现这些接口。
- 一个web.xml文件中可以注册多个servlet事件监听器,web服务器按照它们在web.xml文件中的注册顺序来加载和注册这些servlet事件监听器。
- 一个web应用程序只会为每个事件监听器创建一个对象。