Spring Boot静态资源无法访问之解决方案

  1. Spring Boot配置拦截器导致静态资源无法访问之解决方案
  2. 自行配置静态资源地址映射的其他注意点
    1. 分析

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),又遇到了这个问题:

image-20200426223747064

image-20200426223654161

该页面的逻辑是,搜索某客户价值信息时,将跳转到 “原url/客户档案号” 显示搜索结果。当我访问"/valueCalculating"时页面正常,但访问"/valueCalculating/1"时页面静态资源全部失效。

我翻到以前写的这篇文章,按照上面的笔记自行配置静态资源,但失败了:

@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
    }
}

image-20200426224608204

尝试了很久发现,当这样配置资源处理正则式,生效:

public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**","/valueCalculating/**").addResourceLocations("classpath:/static/");
}

image-20200426225207077

分析

正常我们访问一个页面www.haha.com

如果该页面引用了"my.css"文件,引用写法为:

<link rel="stylesheet" href="css/my.css">

那么浏览器就会通过访问www.haha.com/css/my.css获取该静态文件

回到之前的问题

“/**” 正则式仅代表 资源文件路径的一个层级,所以当我访问"/valueCalculating/1"时会出现如下情形:

比方说我在界面里引入了jquery:

image-20200426230014927

我之前所写的资源配置类就会请求"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/
目录
×

喜欢就点赞,疼爱就打赏