filter拦截过程:
Filter接口中的三个方法:
init方法:在过滤器对象被创建后,执行初始化方法。
doFilter方法:在这个方法里面实现拦截和放行。
destroy方法:在过滤器销毁后,执行。
实现程序:
package cn.itcast.chapter08.filter;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().print(“hello Filter”);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
创建MyFilter的Filter类,拦截访问servlet资源,如果要放行,执行doFilter方法:
package cn.itcast.chapter08.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;
/**
-
Servlet Filter implementation class MyFilter
*/
public class MyFilter implements Filter {/**
- @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 允许访问目标资源
chain.doFilter(request, response);
System.out.println(“输出内容了,代表拦截响应”);
}
/**
- @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
- @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
}
在web.xml文件中对servlet进行配置:
MyFilter
/MyServlet
filter映射:
使用通配符“*”拦截所有的用户请求:配置有三种形式:
完全目录匹配:比如/MyServlet
目录匹配:比如/,/aa/代表拦截aa目录下的所有请求
扩展名匹配:比如.do,.action,错误写法:/*.do
拦截不同方式的访问请求:
REQUEST:当用户直接访问页面时,web容器将会调用过滤器
INCLUDE:如果目标资源时通过RequestDispatcher的include()方法访问的,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:如果目标资源时通过RequestDispatcher的forward()方法访问的,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
ERROR:如果目标资源时通过声明式异常处理机制调用的,那么该过滤器将被调用
filter链:
创建两个过滤器MyFilter01和MyFilter02:
MyFilter01:
packagecn.itcast.chapter08.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;
/**
-
Servlet Filter implementation class MyFilter01
*/
public class MyFilter01 implements Filter {/**
- @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
- @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
response.getWriter().print(“hello MyFilter01-------before
”);
chain.doFilter(request, response);
response.getWriter().print(“hello MyFilter01-------after
”);
}
/**
- @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
- @see Filter#destroy()
}
MyFilter02:
package itcast.chapter08.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;
/**
-
Servlet Filter implementation class MyFilter02
*/
public class MyFilter02 implements Filter {/**
- @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
- @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
response.getWriter().print(“hello MyFilter02-----------before
”);
chain.doFilter(request, response);
response.getWriter().print(“hello MyFilter02-----------after
”);
}
/**
- @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
- @see Filter#destroy()
}
FilterConfig接口: