1

このフィルタを考えると:

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);
    }

同じリクエストで何度も呼び出されるのを見てきました

スプリング ブート アプリ:

@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();
    }
}

タイル構成:

@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;
     }

}

これは私がログに見るものです:

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

ブラウザによって行われる唯一の実際のリクエストは次のとおりです。

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

関連するタイル ( /standard.jsp) はどこから来たのですか? 従来の Spring MVC アプリケーションでは、それらは決して現れませんでした。

MyFilter が OncePerRequestFilter を拡張できることは知っていますが、使用する必要がある実際のフィルターを変更することはできません。それらはレガシー ライブラリからのものです。

4

1 に答える 1

1

MyFilter がマップされているため/*、コンテナー転送でも呼び出されることに気付きました (したがって、Tile の standard.jsp...)。DispatcherServlet を match に変更/action/*し、フィルターも変更しました。

@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;
}
于 2016-04-07T15:08:33.397 に答える