Spring Boot静态资源无法访问之解决方案
Spring Boot配置拦截器导致静态资源无法访问之解决方案
Spring Boot版本:2.1.9
我的静态文件都位于static文件夹中。原错误代码如下:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Autowired
SessionInterceptor sessionInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(sessionInterceptor).addPathPatterns("js/**","css/**","/");//放行静态资源
}
}
@Component
public class SessionInterceptor implements HandlerInterceptor {
@Autowired
UserMapper userMapper;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Cookie[] cookies=request.getCookies();
if(cookies!=null && cookies.length!=0){
User user=null;
for (Cookie cookie:cookies) {
if (cookie.getName().equals("token")){
String token=cookie.getValue();
user=userMapper.findByToken(token);
if (user!=null){
request.getSession().setAttribute("user",user);
}
break;
}
}
if (user==null){
response.sendRedirect("/");
return false;
}
}
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 {
}
}
但始终无法放行静态资源,网上查询良久,得知:一旦添加拦截器后,Spring Boot不能像以往一样直接访问到static文件夹。
原因:我配置拦截器继承的类是:WebMvcConfigurationSupport这个类,它会让spring boot的自动配置失效。
要想访问得静态文件应使用地址如:localhost:8080/static/js/jquery.min.js
方便起见,我们可以自行配置静态资源地址映射:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
······
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
}
······
}
(以上为2019年10月所作)
自行配置静态资源地址映射的其他注意点
2020年四月的一天,我在接活做外包,做一个简单的后台系统(SpringBoot+Thymeleaf),又遇到了这个问题:
该页面的逻辑是,搜索某客户价值信息时,将跳转到 “原url/客户档案号” 显示搜索结果。当我访问"/valueCalculating"时页面正常,但访问"/valueCalculating/1"时页面静态资源全部失效。
我翻到以前写的这篇文章,按照上面的笔记自行配置静态资源,但失败了:
@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
}
}
尝试了很久发现,当这样配置资源处理正则式,生效:
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**","/valueCalculating/**").addResourceLocations("classpath:/static/");
}
¶分析
如果该页面引用了"my.css"文件,引用写法为:
<link rel="stylesheet" href="css/my.css">
那么浏览器就会通过访问www.haha.com/css/my.css获取该静态文件
回到之前的问题
“/**” 正则式仅代表 资源文件路径的一个层级,所以当我访问"/valueCalculating/1"时会出现如下情形:
比方说我在界面里引入了jquery:
我之前所写的资源配置类就会请求"localhost:8080/valueCalculating/plugins/jquery/jquery.min.js"来获取该文件。 “/**” 这个写法只去掉了一个层级,将“localhost:8080/valueCalculating/1” 变为 “localhost:8080/valueCalculating” 。并没实现我所想要的去掉所有层级的目的。
所以当我将其改为"/valueCalculating/**"就起作用了
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,邮件至 708801794@qq.com
文章标题:Spring Boot静态资源无法访问之解决方案
文章字数:752
本文作者:梅罢葛
发布时间:2020-04-26, 01:16:39
最后更新:2020-04-28, 02:07:54
原始链接:https://qiurungeng.github.io/2020/04/26/Spring%20Boot%E9%85%8D%E7%BD%AE%E6%8B%A6%E6%88%AA%E5%99%A8%E5%AF%BC%E8%87%B4%E9%9D%99%E6%80%81%E8%B5%84%E6%BA%90%E6%97%A0%E6%B3%95%E8%AE%BF%E9%97%AE%E4%B9%8B%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/