过滤器
过滤器有两个功能:
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>
<filter-mapping>
<filter-name>MyServlet</filter-name>
<url-pattern>/MyServlet</url-pattern>
</filter-mapping>
只拦截 访问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
>的位置决定