博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring boot 2.0 + 静态资源被拦截,怎么办?
阅读量:6910 次
发布时间:2019-06-27

本文共 2361 字,大约阅读时间需要 7 分钟。

问题描述:使用springboot 2.0后,按照springboot 1.5版本(以下简称旧版)的方式去配置项目。结果发现静态资源访问不到了,本文对此情况分析、处理

项目结构:

  • 直接上图

1331009-20180511105259999-1631244665.png

如果是在旧版,需要访问下图静态资源,

1331009-20180511111500037-651114141.png

地址应该为: localhost:8080/admin/js/base.js

原因在于:META-INF/resources / resources / static / public 都是spring boot 认为静态资源应该放置的位置,会自动去寻找静态资源

然而,在2.0之后 就发生了变化。

先看本文的基础,拦截器

BaseInterceptor

  • 毫无疑问,需要定义一个类:BaseInterceptor 应实现 HandlerInterceptor
  • 在其 preHandle中 需要重写,自定义拦截配置,大概如下图:

    1331009-20180511113045785-14821339.png

  • 作用:拦截没有登录,并试图知己访问后台的地址的操作。

再看本文的关键,WebMvcConfig

  • 此类需要实现 WebMvcConfigurer
  • 在旧版中,一般继承 WebMvcConfigurerAdapter类,但由于2.0后,WebMvcConfigurer 接口中定义了很多default方法(基于jdk1.8+ )
  • WebMvcConfigurer中配置如下:

  • 注意:需要在重写的第二个方法中,添加静态资源路径,这是能否被识别的关键

@Componentpublic 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/**");    }    /**     * 添加静态资源文件,外部可以直接访问地址     * @param registry     */    @Override    public void addResourceHandlers(ResourceHandlerRegistry registry) {        //其他静态资源,与本文关系不大        registry.addResourceHandler("/upload/**").addResourceLocations("file:"+ TaleUtils.getUplodFilePath()+"upload/");        //需要配置1:----------- 需要告知系统,这是要被当成静态文件的!        //第一个方法设置访问路径前缀,第二个方法设置资源路径        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");    }    @Override    public void addViewControllers(ViewControllerRegistry registry) {        //registry.addViewController("/error/404").setViewName("/admin/page_error/error_404.html");    }}

按照如上配置

  • 访问:http://localhost:9090/static/admin/js/base.js,即可正常访问到。
  • 也就是在html文件中,不要像之前一样,/admin/js/base.js 而应该在前方加上addResourceHandlers中配置的名字

之前谁在拦截静态资源?

  • 可以在aseInterceptor 中的 preHandle() 方法体内打断点,会发现访问static下的静态资源时候会进入此方法。
  • 也就是被其当做正常的访问路径去识别。导致无法正常加载。
  • 换句话说,也就是配置的不完整,导致静态资源没有被识别。

还可以参考

https://my.oschina.net/dengfuwei/blog/1795346

  • WebMvcConfigaddInterceptors方法中,添加排除路径;
  • 但是尴尬的是,我copy的项目结构不太一样,static/template下方都有 admin文件夹,并且登录访问还是admin开始
  • 如果排除静态资源的话,那些需要跳转的html也被排除了 。

18-5-23日更新

  • 原文中的配置还是有问题!
  • 还是应该在 WebMvcConfig 中的 addInterceptors 排除路径,原来虽然能访问到静态资源,但是还是被拦截器中的 preHandle拦截!
  • 所以还是应该配置排除拦截的路径,上方 WebMvcConfig类中内容已更改~

18-7-31日更新

  • 仅供参考。等搞清楚再来更新。

转载于:https://www.cnblogs.com/kangkaii/p/9023751.html

你可能感兴趣的文章
ASP.NET Core优化MD5加密
查看>>
flexible伸缩盒模型
查看>>
第二天作业
查看>>
Zabbix 源码编译安装
查看>>
Djang简介
查看>>
两表通过字段关联进行级联删除。
查看>>
Kickstart无人值守安装[转载]
查看>>
消息队列一:为什么需要消息队列(MQ)?
查看>>
最基本springMVC,响应页面请求
查看>>
Sencha-概念-Environment Detection(环境检测)(官网文档翻译12)
查看>>
jsp学习-分页功能的实现
查看>>
第三章 熟悉常用的HDFS操作
查看>>
23种C++设计模式:Factory 模式
查看>>
Tomcat在webapps下部署多个项目
查看>>
截取字符串一之substr
查看>>
hibernate.cfg.xml配置文件对关联关系的书写技巧!
查看>>
【ORACLE】使用中注意事项(二)
查看>>
复选框单选框与文字对齐问题的研究与解决
查看>>
linux 常用命令-配置登陆方式
查看>>
[Android Pro] Android 手机root 并 安装 BusyBox pro 和 Android Terminal Emulator
查看>>