刨根问底:Spring Boot中HandlerInterceptor没有拦截静态资源问题

在Spring Boot中设置了HandlerInterceptor,发现对于js、css等文件都没有起作用。 定义一个HandlerInterceptor

public class FooInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("foo");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
    }

}

将HandlerInterceptor匹配到所有路径

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new FooInterceptor())
                .addPathPatterns("/**");

    }

}

这时虽然PathPatterns设置了“/**”,但是发现FooInterceptor对静态资源没有起作用。这时看看addInterceptors方法上的注释。

Add Spring MVC lifecycle interceptors for pre- and post-processing of controller method invocations. Interceptors can be registered to apply to all requests or be limited to a subset of URL patterns. Note that interceptors registered here only apply to controllers and not to resource handler requests. To intercept requests for static resources either declare a MappedInterceptor bean or switch to advanced configuration mode by extending WebMvcConfigurationSupport and then override resourceHandlerMapping.

说明它只对controller起作用,如果想对静态资源起作用,简单的方法是添加一个MappedInterceptor bean。

@Configuration
public class WebConfig {

    @Bean
    public MappedInterceptor getMappedInterceptor() {
        return new MappedInterceptor(new String[] { "/**" }, new FooInterceptor());
    }
}

参考代码见https://github.com/kabike/spring-boot-demo

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一“技”之长

Swift讲解专题八——闭包 原

        Swift中的闭包是有一定功能的代码块,这十分类似于Objective-C中的block语法。Swift中的闭包语法风格十分简洁,其作用和函数的...

512
来自专栏Python小屋

Python中修饰器的定义与使用

修饰器(decorator)是函数嵌套定义的另一个重要应用。修饰器本质上也是一个函数,只不过这个函数接收其他函数作为参数并对其进行一定的改造之后使用新函数替换原...

2695
来自专栏Python专栏

Python | super函数是如何来继承的

Py 2.x 和 Py 3.x 中有一个很大的区别就是类,无论是类的定义还是类的继承。Py 3.x 中类的继承可以直接使用 super() 关键字代替原来的 s...

833
来自专栏TungHsu

这或许是对小白最友好的python入门了吧——12,列表深入体验

有些时候我们不需要整个列表元素,只需要其中一段列表就好了,我们应该怎么办呢? 这个叫做列表切片。 exam = ["cet","english","math",...

2595
来自专栏对角另一面

读 Zepto 源码之内部方法

数组方法 定义 var emptyArray = [] concat = emptyArray.concat filter = emptyArr...

1980
来自专栏拂晓风起

java 字符串编码转换 字符集/编码的见解 心得 体会(跟之前那个C++编码随笔对应)

1293
来自专栏java架构师

WCF技术剖析_学习笔记之三

数据契约 通过特性来定义,保证服务端和客户端对数据有一致性的理解。 [DataContract]用于枚举、类、结构体。而不用于接口。不可被继承。 3个属性成员:...

2584
来自专栏全沾开发(huā)

学习zepto.js(对象方法)[2]

学习zepto.js(对象方法)[2] 今天来说下zepto那一套dom操作方法, ['prepend', 'append', 'pr...

2966
来自专栏TungHsu

这或许是对小白最友好的python入门了吧——18,用while循环处理列表

for循环可以遍历列表字典,但是想要用for循环在遍历的时候对其进行修改就很困难了,这个时候可以用while循环。 exams = ["chinese","ma...

3398
来自专栏Web 开发

JS中的attribute和property

每一个dom节点,都有各自的attributes和properties。这两者很容易用混,尤其是在表单元素上面。

650

扫码关注云+社区