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

相关推荐
教练、我想打篮球8 分钟前
117 javaweb servlet+jsp 项目中修改了 数据库连接配置, 却怎么都不生效
java·servlet·jdbc·jsp
你不是我我10 分钟前
【Java 开发日记】我们来说一说 Redis IO 多路复用模型
java·开发语言·redis
想七想八不如1140811 分钟前
408操作系统 PV专题
开发语言·算法
SadSunset12 分钟前
(13)复杂查询
java·笔记·架构·mybatis
浩瀚地学13 分钟前
【Java】ArrayList
java·开发语言·经验分享·笔记
阿杰同学21 分钟前
Java 设计模式 面试题及答案整理,最新面试题
java·开发语言·设计模式
这样の我21 分钟前
java 模拟chrome指纹 处理tls extension顺序
java·开发语言·chrome
vx_bisheyuange22 分钟前
基于SpringBoot的游戏交易系统
spring boot·后端·游戏·毕业设计
yong999023 分钟前
基于MATLAB的雷达压制干扰仿真
开发语言·matlab