Filter过滤器
1.1什么是Filter?
Filter被称为过滤器,基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应出来前后实现一些特殊功能。这就好比现实中的污水进化设备,可以看作是一个过滤器。
Filter接口中的方法
方法声明 | 功能描述 |
---|---|
init(FilterConfig filterConfig) | 用来初始化过滤器,开发人员可以在init()方法中 完成与构造方法类似的初始化功能。 |
doFilter(ServletRequest request, ServletResponse response,FilterChain chain) | doFilter()方法中有多个参数,其中request和response为Web服务器或Filter链中的上一个Filter传递过来的请求和响应对象;chain代表当前Filter链的对象,在当前对象中的doFilter()方法的内部需要调用FilterChain对象的doFilter()方法,才能把请求交付给Filter链中的下一个Filter或者目标程序去处理。 |
destroy() | destroy()方法在Web服务器卸载Filter对象之前被调用,该方法用于释放被Filter对象打开的资源,例如关闭数据库和IO流 |
1.2实现一个Filter中的程序
编写MyServlet.java代码如下:
package itcast.filter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("hello MyServlet!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
同时在web.xml中配置Servlet。
再编写MyFilter.java如下:
package itcast.filter;
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
public class MyFilter implements Filter {
public void init(){
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
PrintWriter out= servletResponse.getWriter();
out.write("Hello MyFilter");
}
@Override
public void destroy() {
}
}
Filter同样需要在web.xml中配置,从而设置它所能拦截的资源,具体代码如下:
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>itcast.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/MyServlet</url-pattern>
</filter-mapping>
在上述代码中设置了过滤器对/MyServlet进行拦截
1.3Filter映射
1.使用通配符“*”拦截用户的所有请求
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>itcast.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.拦截不同方式的访问请求
元素中有一个特殊的子元素,该元素用于指定过滤器所拦截的资源被Servlet调用的方式,dispatcher中共有4个值:
-
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过Request Dispatcher的include()或者forward()方法访问时,这个过滤器不会被调用。
-
INCLUDE:如果目标资源是通过Request Dispatcher的include()访问的,那么该过滤器将被调用。
-
FORWARD:如果目标资源是通过Request Dispatcher的forward()访问的,那么该过滤器将被调用。
-
ERROR:如果目标资源是通过声明式异常处理机制调用的,那么该过滤器将被调用。
1.4Filter链
如果web程序中可以注册多个Filter程序,每个Filter程序都可以针对某一个URL进行拦截。如果多个Filter程序都对同一个url进行拦截,那么这些FIlter就会组成一个Filter链,也就是过滤器链。
Filter链用那个FilterChain对象来表示,FilterChain对象中有一个doFilter()方法,该方法的作用就是让Filter链上的当前过滤器方向,使请求进入下一个Filter.
1.5FilterConfig接口
为了获取Filter接口在web.xml中的配置信息,Servlet API提供了一个FilterConfig接口,该接口封装了FIlter程序在web.xml中所有的注册信息,并且提供了一系列获取这些配置信息的方法。
方法 | 功能描述 |
---|---|
getServletContext | 返回 FilterConfig 对象中所包装的 ServletContext 对象的引用 |
getInitParameter | 用于返回在 web.xml 文件中为 Filter 所设置的某个名称的初始化的参数值 |
getFilterName | 返回 元素的设置值 |
getInitParameterNames | 返回一个 Enumeration 集合对象 |