SpringBoot中静态资源访问
⽬录
1 静态资源到存放路径
实例:
那么这是如何进⾏通过链接进⾏访问,下⾯是资源配置⽅法,进⾏路径拦截之后到对应的⽂件路径
springboot是啥package com.fig;
import org.springframework.beans.factory.annotation.Autowired;
import t.annotation.Bean;
import t.annotation.Configuration;
import org.s.CorsConfiguration;
import org.s.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.fig.annotation.InterceptorRegistry;
import org.springframework.fig.annotation.ResourceHandlerRegistry;
import org.springframework.fig.annotation.WebMvcConfigurer;
import fig.RuoYiConfig;
import stant.Constants;
import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor;
/**
* 通⽤配置
*
* @author ruoyi
*/
@Configuration
public class ResourcesConfig implements WebMvcConfigurer
{
@Autowired
private RepeatSubmitInterceptor repeatSubmitInterceptor;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
/** 本地⽂件上传路径 */
registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**").addResourceLocations("file:" + Profile() + "/"); /** swagger配置 */
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/METAINF/resources/webjars/");
//当时写的好像是上传的路径然后进⾏访问
registry.addResourceHandler("/police" + "/**").addResourceLocations("file:" + Property("user.home")+"/police/fileInfo/"); registry.addResourceHandler( "/static"+"/**").addResourceLocations("classpath:/static/");
}
/**
* ⾃定义拦截规则
*/
@Override
public void addInterceptors(InterceptorRegistry registry)
{
registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**");
}
/**
* 跨域配置
*/
@Bean
public CorsFilter corsFilter()
{
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
// 设置访问源地址
config.addAllowedOrigin("*");
// 设置访问源请求头
config.addAllowedHeader("*");
// 设置访问源请求⽅法
config.addAllowedMethod("*");
// 对接⼝配置跨域设置
return new CorsFilter(source);
}
}
访问本地⽂件
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
registry.addResourceHandler("/pdf" + "/**").addResourceLocations("file:" + Property("user.home")+"/lcls/fileInfo/");
}
C:\Users\Administrator\lcls\fileInfo
上⾯的例⼦应该可以快速的进⾏修改,下⾯进⾏原理讲解当使⽤SpringMVC框架访问静态资源时,静态资源会被拦截,需要添加额外配置。搭建SSM环境时,可以通过<mvc:resources />节点来配置不拦截静态资源,代码如下:
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/html/**" location="/html/"/>
这是⼀种Ant风格的路径匹配符,/**表⽰可以匹配任意层级的路径,所以上⾯的代码可以简化为:
<mvc:resources mapping="/**" location="/"/>
上⾯这种配置是通过xml⽂件实现的,⽽且通俗易懂,其实在Java中也可以通过Java代码实现,如果通过Java代码实现,可以⾃定义⼀个类,并且让其集成WebMvcConfigurationSupport即可,代码如下:
@Configuration
@ComponentScan(basePackages = "com.mango.javassm")
public class SpringMVCConfig extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("/");
}
}
上⾯代码中,其实就是重写了WebMvcConfigurationSupport中的addResourceHandlers⽅法,并且在该⽅法中配置静态资源访问路径。上⾯两种配置⽅式实现的效果是⼀样的。
上⾯介绍的两种⽅式都是传统的解决⽅案,在SpringBoot中,配置⽅式和SSM相同,不同的是SpringBoot是⾃动化配置。正是这些⾃动化配置能⼤⼤的节省开发⼈员的代码,⾃然⽽然也就降低了出错率。(写的越多,bug越多)
通配符说明
匹配任意⼀个字符
*匹配任意字符(包括0个)
**匹配任意层路径(包括0个)
常见Ant风格场景:
1. Spring资源加载:classpath:/static/
2. SpringMVC的URL映射:@GetMapping("/hello")
3. Spring注解扫描:<mvc:resources mapping="/**" location="/"/>
【SpringBoot中的配置】
2 如何访问静态资源
在SpringBoot中,默认情况下,共有5个地⽅可以放静态资源,分别是:
1. classpath:/META-INF/resources/
2. classpath:/resources/
3. classpath:/static/
4. classpath:/public/
5. /
其实前⾯的四个⽬录都容易理解,分别是对应resources下不同的⽬录,但是第5个中的/是啥呢?
我们都知道,在 Spring Boot 项⽬中,默认是没有webapp这个⽬录的,当然我们也可以⾃⼰⼿动进⾏添加(例如在需要使⽤jsp的时候),这⾥第5个/其实就是表⽰webapp⽬录中的静态资源也不被拦截。如果同⼀个⽂件分别出现在五个⽬录下,那么优先级也是按照上⾯列出的顺序来进⾏访问的。
虽然默认情况下提供了5个访问⽬录,但第5个⽬录很少会使⽤到。由于创建项⽬时,默认给我们创建了classpath:/static/,⼀般情况下,我们只需要把我们的静态资源放到该⽬录下即可,不需要额外创建⽬录,例如:我在classpath:/static/⽬录下放了⼀个hello.js⽂件,那么访问该js⽂件的路径是:
localhost:8080/hello.js
值得注意的是,请求地址中并不需要 static,如果加上了static反⽽多此⼀举会报404错误。很多⼈会觉得奇怪,为什么不需要添加 static呢?资源明明放在 static ⽬录下。其实这个效果很好实现,例如:在SSM配置中,我们的静态资源拦截配置如果是下⾯这样:
<mvc:resources mapping="/**" location="/static/"/>
回到SpringBoot中,既然它的原理和SSM相同,所以这⾥就不难理解了。
3 源码解读
学习新的东西,最准确的⽅式莫过于阅读源码了,下⾯我们通过源码来看看SpringBoot中静态资源是如何配置的。
⾸先,我们在WebMvcAutoConfiguration类中看到SpringMVC⾃动化配置的相关内容,到了静态资源拦截的配置,如下:
其实从上⾯这段标出的内容可以看出,这⾥对静态资源的定义和前⾯提到的Java配置SSM⾮常相似。其
中,StaticPathPattern()⽅法对应的值就是"/**",Sta
ticLocations()⽅法返回了⼀个String[]数组,其中包含了共4个位置,它们分别是:"classpath:/META-INF/resources/"、"classpath:/resources/"、"classpath:/static/"、"classpath:/public/",然后
在getResourceLocations⽅法中的SERVLET_LOCATIONS⼜添加了"/",因此这⾥⼀共返回了5个位置,其中"/"表⽰webapp⽬录,即webapp⽬录下的静态资源也可直接访问。静态资源匹配路径按照定义路径优先级依次降低,前⾯4个不难理解,⾄于为什么"/"排在最后,我想⼤家仔细看下源码就能明⽩。
如此看来,⼤家应该明⽩了为什么SpringBoot中默认⽀持5个静态资源位置的配置了,同时也明⽩了为什么访问静态资源的请求路径中不⽤添加/static了,因为路径映射中已经⾃动添加了。
4 ⾃定义配置
这⾥给提供两种⽅式,⼀种是通过配置⽂件实现,另⼀种是通过Java类来实现,不管是哪种,实现的效果都是相同的。
【application.properties】
spring.mvc.static-path-pattern=/**
注:上⾯classpath:/mango中的mango是我在resources下创建的⼀个⽬录。
【Java类】
当然,在SpringBoot中也可以通过Java代码来定义,和⽤Java来配置SSM⽅式⽐较类似,如下:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/mango/");
}
}
这段代码⽐较简单,之前也讲过,这⾥就不再啰嗦了。
5 总结
这⾥需要注意的是,很多⼈⽤了Thymeleaf模板引擎之后,会将静态资源也放在resources/templates⽬录下,注意,templates⽬录并不是静态资源⽬录,它是⼀个放页⾯模板的位置(你看到的Thymeleaf模板虽然后缀为.html,其实并不是静态资源)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论