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不一样。
求解。
你是配置了两个过滤器的,只是过滤器的类型是同一个。
容器启动过程中是根据你配置的filter节点创建过滤器的,你配置了两个名称不同但类型相同的过滤器,那它就会实例化两个过滤器了。
祝好!
谢谢楼上的回答,我的过滤器仅仅配置了一个。由于自动添加了注解,所以重复了。
已解决。