SpringBoot静态资源与缓存配置全解析

springboot中静态资源

classpath就是resource文件夹下

欢迎页规则

项目启动默认去找静态资源下的index.html页面 默认访问该页面

favicon原则

在静态资源目录下寻找favicon.ico

缓存实验

在请求中使用Cache-Control 时,它可选的值有:

在响应中使用Cache-Control 时,它可选的值有:

配置浏览器缓存

复制代码
spring:
  web:
    locale: zh_CN # 国际化的区域信息
    resources:
      add-mappings: true #开启静态资源映射
      cache:
        period: 3600 #缓存时间 以秒为单位
        cachecontrol:  # 缓存详细控制 覆盖上面的配置
          max-age: 7200

自定义静态资源配置

复制代码
spring:
 web:
    locale: zh_CN # 国际化的区域信息
    resources:
      # 修改resource文件夹下的静态资源路径
      static-locations: classpath:/a/, classpath:/a/
  mvc:
    webjars-path-pattern: /wj/**
    # 静态资源访问前缀
    static-path-pattern: /static/**

路径匹配

ant风格路径匹配

默认使用新版pathpattern路径匹配

不能匹配**在中间的情况,剩下的与ant风格兼容

配置文件改变路径匹配策略:

复制代码
spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

内容协商

1.多端内容适配

第二种方法需要自行开启

2.效果演示

请求同一个接口,返回json和xml不同格式数据

1.引入依赖

复制代码
<!--        引入xml相关依赖-->
<dependency>
  <groupId>com.fasterxml.jackson.dataformat</groupId>
  <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

2.加入注解

在数据类型中加入

复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
@JacksonXmlRootElement
//可以讲数据转化为xml格式
public class Person {
    private long id;
    private String name;
    private String email;
    private Integer age;
}

3.配置协商规则

开启基于参数传递格式
复制代码
spring:
  mvc:
    contentnegotiation:
      favor-parameter: true   # 默认参数为format
      parameter-name: type    # 修改参数名
效果演示:

根据type类型返回不同的内容格式

自定义内容返回

1.增加yaml返回支持

导入依赖:

复制代码
<!--        导入支持yaml解析的模块-->
<dependency>
  <groupId>com.fasterxml.jackson.dataformat</groupId>
  <artifactId>jackson-dataformat-yaml</artifactId>
</dependency>

编写配置:

复制代码
spring:
  mvc:
      contentnegotiation:
        media-types:
          yaml: text/yaml

增加HttpMessageConverter组件

例如:MyYamlHttpMessageConverters

复制代码
public class MyYamlHttpMessageConverters extends AbstractHttpMessageConverter {

    private ObjectMapper objectMapper=null;
    public MyYamlHttpMessageConverters(){
        //告诉springboot支持什么媒体类型(对应配置文件中的)
        super(new MediaType("application", "yaml", Charset.forName("utf-8")));
        //禁用文档开始前出现的横线
        YAMLFactory Factory = new YAMLFactory().disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER);
        this.objectMapper = new ObjectMapper(Factory);
    }

    @Override
    protected boolean supports(Class clazz) {

        //只要是对象类型都支持转换
        return true;
    }

    @Override  //requestbody
    protected Object readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        return null;
    }

    @Override   //responsebody 把对象写出去
    protected void writeInternal(Object returnValue, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        OutputStream body = outputMessage.getBody();
        try {
            this.objectMapper.writeValue(body,returnValue); //把对象返回值写出去
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            body.close();
        }


    }
}

在配置文件中加入:

复制代码
//配置一个能把对象转为yaml的MessageConverters
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(new MyYamlHttpMessageConverters());
}

内容协商原理

httpmessageconverter

系统默认:


错误处理

1. 错误处理流程:

能处理就处理处理不了就转发给springboot处理,先精确匹配,找模板引擎下的,找不到就去静态资源下找,后模糊匹配,先找模板引擎下的,找不到就去静态资源下找,如果都没有具体页面,再去匹配error页面,若也没有,springboot会提供默认error页面

2. 错误页面解析:

如果没有配置错误处理,就会使用默认的错误页面error

规则:

  1. 解析一个错误页
    1. 如果发生了500,404,403错误(精确匹配)
      1. 如果有模板引擎 ,默认在classpath:/templates/error/精确码.html
      2. 如果没有模板引擎,在静态资源文件夹下找精确码.html
    1. 如果精确找不到精确码.html,就去找5xx.html,4xx.html(模糊匹配)
      1. 如果有模板引擎,默认在classpath:/templates/error/5xx.html
      2. 如果没有模板引擎,在静态资源文件夹下找 5xx.html
  1. 如果没有模板引擎templates下有error.html页面就直接渲染

  2. 如果都没有,容器中有一个默认为error的view,提供了默认白页功能。

    @Bean(name="error")
    @CondiontionalOnMissingBean(name="error")
    public View defaultErrorView(){
    return this.defaultErrorView
    }

3. 最佳实战

嵌入式容器

Servlet容器:管理,运行Servlet组件(Servlet,Filter,Listener)的环境,一般指服务器

1.自动配置原理

Web新特性

1.Problemdetails

配置开启:

复制代码
spring:
	mvc:
    problemdetails:
      enabled: true   #启动

开启后效果:使用新的MediaType类型

content-type+json+额外扩展返回

2.函数式Web

相关推荐
yinyan1314几秒前
一起学springAI系列一:初体验
java·人工智能·ai
jllllyuz4 分钟前
Spring中的事务是如何实现的
数据库·sql·spring
永卿00111 分钟前
设计模式-责任链模式
java·设计模式·责任链模式
hello 早上好15 分钟前
深入解析AOP调用链:递归与责任链模式的协同实现
java·责任链模式
程序员编程指南18 分钟前
Qt 开发自动化测试框架搭建
c语言·开发语言·c++·qt
wangmengxxw25 分钟前
Spring-常用注解
java·数据库·spring·注解
三小尛29 分钟前
C++赋值运算符重载
开发语言·c++
一只鹿鹿鹿32 分钟前
【网络安全】信息网络安全建设方案(WORD)
人工智能·安全·spring·web安全·低代码
籍籍川草33 分钟前
JVM指针压缩的那些事
java·开发语言·jvm
小徐不徐说40 分钟前
C++ 模板与 STL 基础入门:从泛型编程到实战工具集
开发语言·数据结构·c++·qt·面试