Filter定义:
public class EncodingFilter implements Filter {
/**
* Default constructor.
*/
public EncodingFilter()
{
System.out.println("创建过滤器EncodingFilter");
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
System.out.println("filter destroy");
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
HttpServletRequest httpReq = (HttpServletRequest)request;
System.out.println("call Encoding doFilter,requestURI:" + httpReq.getRequestURI());
response.setContentType("text/html; charset=UTF-8");
// pass the request along the filter chain
chain.doFilter(request, response);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
System.out.println("Encoding Filter init,config:" + fConfig);
}
Filter配置:
encodingFilter
filter.EncodingFilter
encodingFilter
/login.jsp
启动容器时,打印结果如下:
创建过滤器EncodingFilter
Encoding Filter init,config:ApplicationFilterConfig[name=encodingFilter, filterClass=filter.EncodingFilter]
创建过滤器EncodingFilter
Encoding Filter init,config:ApplicationFilterConfig[name=filter.EncodingFilter, filterClass=filter.EncodingFilter]
从打印信息来看,是执行了两次init。根据debug,进一步证实。
疑问是,既然filter配置的是同一个过滤器,那么为什么初始化时要调用两次呢?而且两次的fitername不一样。
求解。