2016-04-07 12 views
1

diese Filter Gegeben:Spring Boot - Warum wird MyFilter oft in einer einzigen Anfrage aufgerufen, wenn Tiles + JSP verwendet wird?

public class MyFilter implements Filter{ 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
      throws IOException, ServletException { 
     System.out.println("FILTERING!!!!!!!!!!!!!!!!!!!"+((HttpServletRequest)request).getRequestURI()); 
     chain.doFilter(request, response); 
    } 

Ich habe gesehen viele Male in der gleichen Anfrage

Frühling Boot-App aufgerufen wird:

@SpringBootApplication(scanBasePackageClasses={MySpringBootDemoApplication .class, TilesConfiguration.class}) 
public class MySpringBootDemoApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(MySpringBootDemoApplication .class, args); 
    } 

    @Bean 
    public Filter myFilter(){ 
     return new MyFilter(); 
    } 
} 

TilesConfiguration:

@Configuration 
public class TilesConfiguration { 

    @Bean 
    public TilesConfigurer tilesConfigurer() { 
     final TilesConfigurer configurer = new TilesConfigurer(); 
     configurer.setDefinitions(new String[] { "WEB-INF/**/tiles.xml" }); 
     configurer.setCheckRefresh(true); 
     return configurer; 
    } 

    @Bean 
    public TilesViewResolver tilesViewResolver() { 
     final TilesViewResolver resolver = new TilesViewResolver(); 
     resolver.setViewClass(TilesView.class); 
     return resolver; 
    } 

} 

Dies ist, was ich in den Protokollen sehe:

FILTERING!!!!!!!!!!!!!!!!!!!/spring-boot-demo/home 
FILTERING!!!!!!!!!!!!!!!!!!!/spring-boot-demo/WEB-INF/layouts/standard.jsp 
FILTERING!!!!!!!!!!!!!!!!!!!/spring-boot-demo/WEB-INF/layouts/standard.jsp 
FILTERING!!!!!!!!!!!!!!!!!!!/spring-boot-demo/WEB-INF/layouts/standard.jsp 

Die einzige vom Browser aus realer Anfrage ist:

FILTERING!!!!!!!!!!!!!!!!!!!/spring-boot-demo/home 

Wo die Fliesen im Zusammenhang (/standard.jsp) kommen? In herkömmlichen Spring MVC-Anwendungen sind sie nie aufgetaucht.

Ich weiß, dass MyFilter OncePerRequestFilter erweitern kann, aber ich kann die echten Filter, die ich verwenden muss, nicht ändern, sie stammen aus Legacy-Bibliotheken.

Antwort

1

Ich habe gerade festgestellt, dass, da MyFilter gegen /* gemappt wird, es auch Container Forwards (daher Tile's standard.jsp ...) aufgerufen wird. Ich habe das DispatcherServlet so geändert, dass es mit /action/* übereinstimmt, und das Gleiche tat ich mit dem Filter:

@Bean 
public FilterRegistrationBean myFilter(){ 
    FilterRegistrationBean frb = new FilterRegistrationBean(); 
    frb.setFilter(new MyFilter()); 
    frb.setUrlPatterns(Arrays.asList(new String[]{"/action/*"})); 
    return frb; 

@Bean 
public ServletRegistrationBean dispatcherRegistration(DispatcherServlet dispatcherServlet) { 
    ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet); 
    registration.addUrlMappings("/action/*"); 
    return registration; 
}