spring boot 2.0 + 静态资源被拦截,怎么办?
问题描述:使用 springboot 2.0 后,按照 springboot 1.5 版本(以下简称旧版)的方式去配置项目。结果发现静态资源访问不到了,本文对此情况分析、处理
项目结构:
- 直接上图
如果是在旧版,需要访问下图静态资源,
地址应该为: localhost:8080/admin/js/base.js
原因在于:META-INF/resources / resources / static / public 都是 spring boot 认为静态资源应该放置的位置,会自动去寻找静态资源
然而,在 2.0 之后 就发生了变化。
先看本文的基础,拦截器
BaseInterceptor
-
毫无疑问,需要定义一个类:
BaseInterceptor
应实现HandlerInterceptor
-
在其
preHandle
中 需要重写,自定义拦截配置,大概如下图: -
作用:拦截没有登录,并试图知己访问后台的地址的操作。
再看本文的关键,WebMvcConfig
-
此类需要实现
WebMvcConfigurer
-
在旧版中,一般继承
WebMvcConfigurerAdapter
类,但由于 2.0 后,WebMvcConfigurer
接口中定义了很多default
方法(基于 jdk1.8+ ) -
WebMvcConfigurer
中配置如下: -
注意:需要在重写的第二个方法中,添加静态资源路径,这是能否被识别的关键
@Component
public class WebMvcConfig implements WebMvcConfigurer {
@Resource
private BaseInterceptor baseInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(baseInterceptor)
// 需要配置 2:----------- 告知拦截器:/static/admin/** 与 /static/user/** 不需要拦截 (配置的是 路径)
.excludePathPatterns("/static/admin/**", "/static/user/**");
}
<span class="hljs-comment">/**
* 添加静态资源文件,外部可以直接访问地址
* <span class="hljs-doctag">@param</span> <span class="hljs-variable">registry</span>
*/</span>
<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">addResourceHandlers</span>(<span class="hljs-params">ResourceHandlerRegistry registry</span>) {
<span class="hljs-comment">//其他静态资源,与本文关系不大</span>
registry.<span class="hljs-title function_">addResourceHandler</span>(<span class="hljs-string">"/upload/**"</span>).<span class="hljs-title function_">addResourceLocations</span>(<span class="hljs-string">"file:"</span>+ <span class="hljs-title class_">TaleUtils</span>.<span class="hljs-title function_">getUplodFilePath</span>()+<span class="hljs-string">"upload/"</span>);
<span class="hljs-comment">//需要配置1:----------- 需要告知系统,这是要被当成静态文件的!</span>
<span class="hljs-comment">//第一个方法设置访问路径前缀,第二个方法设置资源路径</span>
registry.<span class="hljs-title function_">addResourceHandler</span>(<span class="hljs-string">"/static/**"</span>).<span class="hljs-title function_">addResourceLocations</span>(<span class="hljs-string">"classpath:/static/"</span>);
}
<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">addViewControllers</span>(<span class="hljs-params">ViewControllerRegistry registry</span>) {
<span class="hljs-comment">//registry.addViewController("/error/404").setViewName("/admin/page_error/error_404.html");</span>
}
}
按照如上配置
- 访问:
http://localhost:9090/static/admin/js/base.js
,即可正常访问到。 - 也就是在 html 文件中,不要像之前一样,
/admin/js/base.js
而应该在前方加上addResourceHandlers
中配置的名字
之前谁在拦截静态资源?
- 可以在 aseInterceptor 中的 preHandle() 方法体内打断点,会发现访问 static 下的静态资源时候会进入此方法。
- 也就是被其当做正常的访问路径去识别。导致无法正常加载。
- 换句话说,也就是配置的不完整,导致静态资源没有被识别。
还可以参考
https://my.oschina.net/dengfuwei/blog/1795346
- 在
WebMvcConfig
的addInterceptors
方法中,添加排除路径; - 但是尴尬的是,我 copy 的项目结构不太一样,static/template 下方都有 admin 文件夹,并且登录访问还是 admin 开始
- 如果排除静态资源的话,那些需要跳转的 html 也被排除了 。
18-5-23 日更新
- 原文中的配置还是有问题!
- 还是应该在
WebMvcConfig
中的addInterceptors
排除路径,原来虽然能访问到静态资源,但是还是被拦截器中的preHandle
拦截! - 所以还是应该配置排除拦截的路径,上方
WebMvcConfig
类中内容已更改 ~
18-7-31 日更新
- 仅供参考。等搞清楚再来更新。