过滤器 过滤器有两个功能: 1 过滤器 需要在请求和相应拦截 2 需要过滤器放行
1 过滤器(Filter): 实现一个Filter接口 init()、destroy() 原理、执行时机 同Servlet 配置过滤器,类似servlet 通过doFilter()处理拦截,并且通过chain.doFilter(request, response);放行
细节 过滤器中doFilter方法参数:ServletRequest 在Servlet中的方法参数:HttpServletRequest
public class MyFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("init.............."); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("处理请求"); filterChain.doFilter(servletRequest,servletResponse);//过滤器执行停止接着请求向Servlet转发 System.out.println("处理相应的响应"); } @Override public void destroy() { System.out.println("destroy..............."); }2 filter映射 配置filter
<filter> <filter-name>MyServlet</filter-name> <filter-class>cn.tju.filter.MyFilter</filter-class> </filter> MyServlet /MyServlet只拦截 访问MyServlet的请求
<url-pattern>/MyServlet</url-pattern>拦截一切请求(每一次访问 都会被拦截)
<url-pattern>/*</url-pattern>3 通配符 dispatcher请求方式: REQUEST:拦截HTTP请求 get post FORWARD:只拦截 通过 请求转发方式的请求
INCLUDE:只拦截拦截通过 request.getRequestDispatcher("").include() 、通过<jsp:include page="…" />此种方式发出的请求 ERROR:只拦截发出的请求
例子
<filter-mapping> <filter-name>MyServlet</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>当请求转发的时候 客户端请求initServlet的时候,在initServlt中请求转发
request.getRequestDispatcher("jstl2.jsp").forward(request,response);就会拦截两次 过程 Filter处理请求 serlvlet中处理请求 Filter处理转发请求 Filter处理转发的响应 Filter处理响应 当重定向的时候 客户端请求MyServlet的时候,在MyServlet中重定向el.jsp
response.sendRedirect("el.jsp");过程 过滤器处理到MyServlet请求 MyServlet运行,重定向 过滤器处理MyServlet响应 过滤器处理到el.jsp请求 过滤器处理el.jsp响应
4 过滤器链 可以配置多个过滤器,过滤器的先后顺序是由< filter-mapping>的位置决定