问题描述
- 自定义的过滤器为何初始化两次?
-
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.EncodingFilterencodingFilter
/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节点创建过滤器的,你配置了两个名称不同但类型相同的过滤器,那它就会实例化两个过滤器了。
祝好!
解决方案二:
谢谢楼上的回答,我的过滤器仅仅配置了一个。由于自动添加了注解,所以重复了。
已解决。
时间: 2024-09-30 07:39:26