过滤器和监听器
Servlet过滤器是从Servlet2.3规范开始新增的功能,并在Servlet2.4规范中得到增强,监听器可以监听到Web应用程序启动和关闭。创建监听器需要实现响应的接口,并对其进行配置。
Servlet过滤器
1.什么是过滤器
Servlet过滤器与Servlet十分相似,但是它具有拦截客户端请求的功能。Servlet过滤器可以改变请求中的内容,来满足实际开发中的需要。对于程序开发人员来说,过滤器实质上就是在Web应用服务器上的一个Web应用组件,用于拦截客户端与目标资源之间的请求,并对这些请求进行过滤处理再发送给目标资源。
如果在一个Web应用中使用一个过滤器不能解决问题,可以部署多个过滤器对业务请求进行多次处理。这样就形成一个过滤器链,在Web容器处理过滤器链时,将按照过滤器的先后顺序对请求进行处理。
2.过滤器核心对象
过滤器对象放在javax.servlet包中,其名为Filter,它是一个接口,除了这个接口外,与过滤器相关的对象还有FilterConfig对象与FilterChain对象,这两个对象也同样是接口,为位于javax.servlet包中,分别为过滤器的配置对象和过滤器的传递工具。在实际开发过程中,定义过滤器只要直接或间接的实现Filter接口即可。而FilterChain和FilterConfig用于对过滤器的相关操作。
Filter接口
每一个过滤器都要直接或间接的实现Filter接口,在Filter接口中,定义了3个方法,分别为init(),doFilter(),destroy()。对应的方法说明如下:
方法声明 |
说明 |
public void init(FilterConfig filterConfig) throws ServlerException |
过滤器初始化,该方法在过滤器初始化时调用 |
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException |
对请求进行过滤处理 |
public void destroy() |
销毁方法,以便释放资源 |
FilterConfig接口
FilterConfig接口由Servlet容器进行实现,主要用于获取过滤器中的配置信息。其方法说明如下:
方法声明 |
说明 |
Public String getFilterName() |
用于获取过滤器的名字 |
Public ServletContext getServletContext() |
获取Servlet上下文 |
Public String getInitParameter(String name) |
获取过滤器的初始化参数的值 |
Public Enumeration getInitParameterNames() |
获取过滤器所有的初始化参数 |
FilterChain接口
FilterChain接口也是由Servlet容器实现的,在这个接口中只有一个方法,其方法声明为:public void doFilter(ServletRuquest request,ServletResponse response) throws IOException,ServletException
该方法用于将过滤后的请求传递给下一个过滤器,如果此过滤器已经是过滤器中的最后一个过滤器,那么,请求将传送给目标资源。
过滤器的创建与配置
创建也该过滤器需要实现javax.servlet.Filter接口,同时实现接口的3个方法。
范例:
package com.zgy.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
使用过滤器不一定要将请求传递到下一个过滤器,如果业务逻辑需要,也可以在过滤器处理完后,直接回应客户端
创建名称为MyServlet的过滤对象,其web.xml的配置如下:
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.zgy.filter.Myfilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/MyFilter</url-pattern>
</filter-mapping>
<filter>标签用于声明过滤对象,在这个标签中必须配置两个元素,分别为过滤器名称与过滤器完整类名,其中<filter-name>用于定义过滤器的名称,<filter-class>用于指定过滤器的完整类名
<filter-mapping>标签用于创建过滤器的映射,它的主要作用就是指定Web应用中,哪些URL应该用哪个过滤器进行处理。在<filter-mapping>标签中,需要指定过滤的名称和过滤的URL映射,其中,<filter-name>用于定义过滤器的名称,<url-pattern>用于指定过滤器应用的URL。
PS:<filter>标签中的<filter-name>可以是自定义的名称,<filter-mapping>标签中的<filter-name>是指定的已定义的过滤器名称,他需要与<filter>标签中的<filter-name>一一对应