42、SpringBoot的 路径匹配 和 内容协商

文章介绍了SpringBoot中路径匹配的新行为,即默认启用后缀检查,并详细讲解了内容协商的概念、判断方式、推荐策略,包括使用Accept请求头、额外参数以及自定义后缀映射。


SpringBoot的 路径匹配 和 内容协商

对于路径匹配,自己的总结就是:
以前路径匹配时默认不检查后缀,http://localhost:8080/aaa.json 可以直接访问到 @RequstMapping(“/aaa”) 的方法。现在不行了。现在会检查后缀了。


内容协商的理解总结:
就是通过添加 xml 依赖,或者在yml配置文件中进行一些配置,来指定访问的方法响应回来的数据类型,比如 json、xml 等。


路径匹配

以前:路径匹配时默认不检查后缀。

比如请求 “GET /users.json”

Spring MVC可用 @GetMapping(“/users”)修饰的处理方法来处理该请求。


现在,

Pathmatch类中定义了如下一行:

 private boolean useSuffixPattern = false; 

表明Spring Boot默认的路径匹配会执行后缀检查,
这意味着“GET /users.json”请求不会匹配到@GetMapping(“/users”)注解修饰的处理方法。


【可见】:Spring Boot不再建议使用 请求后缀 作为 “内容协商” 的方式。

【简单来说】 请求地址必须与@RequestMapping映射的地址完全相同,不支持请求地址后面带后缀。

对于路径匹配,自己的总结就是:

以前路径匹配时默认不检查后缀,http://localhost:8080/aaa.json 可以直接访问到 @RequstMapping(“/aaa”) 的方法。现在不行了。现在会检查后缀了。


什么是内容协商

内容协商:服务器中控制器的一个处理方法可根据请求自动生成不同 content-type 的响应,比如HTML响应、JSON、XML响应,甚至EXCEL、PDF响应等。


内容协商时如何判断客户端希望接收的响应类型呢?

1、根据Accept请求头(最主流的方式,尤其在RESTful)

2、根据请求地址的后缀,比如请求/users.json,表明希望服务器生成JSON响应。 (已经不再推荐,可能会被彻底删除)

3、根据额外的请求参数。比如请求/users?format=json,表明希望服务器生成JSON响应。

提示:关于内容协商的深入介绍和详细示例,可以参考《轻量级Java Web企业应用实战》的6.5.8小节。


代码演示:

需求:根据设置Accept请求头来演示返回的响应类型。


返回json格式:

添加注解 @RestController 返回的就是 json 格式的数据

在这里插入图片描述

返回 xml 格式:

要返回xml 格式的数据,需要添加xml 的依赖
在这里插入图片描述


如图:代码没变,如果添加了这个 xml 依赖 ,访问这个方法,返回的自己就变成了 xml 格式的响应了。

在这里插入图片描述


postman 测试

在这里插入图片描述


内容协商的推荐方式

1、优先使用Accept请求头。

2、如果不设置合适的Accept请求头,建议使用额外的format参数来告诉服务器生成的响应类型,比如”GET /users?format=json“告诉服务器生成JSON响应。

在Contentnegotiation类的源代码中,包含如下行:

 private boolean favorParameter = false;

表明Spring Boot默认关闭了使用额外的参数来指定响应类型。


可通过如下配置来启用这个 --> 使用额外的参数来指定响应类型:

spring.mvc.contentnegotiation.favor-parameter=true

# 设置使用额外的fkft请求参数(代替原来默认的format请求参数)来指定响应的内容类型
spring.mvc.contentnegotiation.parameter-name=fkft

【为了生成XML响应,首先需要让应用增加XML支持,比如Jackson Dataformat XML】


代码演示:


需求:通过使用额外的参数来指定响应类型

配置这个就能启动 【使用额外参数来执行响应类型】的功能。默认是关闭的,需要在配置中启动。


这种就是内容协商。

#配置通过使用额外的参数来指定响应类型
spring:
  mvc:
    contentnegotiation:
      favor-parameter: true

在这里插入图片描述


演示这个功能:

–> 设置使用额外的 ljh 请求参数名(代替原来默认的format请求参数名)来指定响应的内容类型

spring.mvc.contentnegotiation.parameter-name=ljh

在这里插入图片描述

内容协商的理解总结:就是通过添加 xml 依赖,或者在yml配置文件中进行一些配置,来指定访问的方法响应回来的数据类型,比如 json、xml 等。


强制开启基于后缀匹配的内容协商。


需要同时开启两个设置:

1、路径匹配时启用”后缀匹配“(不检查后缀)
2、内容协商时使用后缀


添加如下配置:

# 设置路径匹配时忽略检查后缀
# 该配置让“GET /users.json”能匹配GetMapping("/users")
spring.mvc.pathmatch.use-suffix-pattern=true

# 开启内容协商时的“后缀匹配”模式
spring.mvc.contentnegotiation.favor-path-extension=true

更安全的配置:

在路径匹配时,后缀匹配只匹配那些已经注册过的后缀类型,比如.json、.xml等,但对于.exe这种未知的后缀那就依然不匹配。

# 设置路径匹配时忽略检查后缀
spring.mvc.pathmatch.use-suffix-pattern=true

# 开启内容协商时的“后缀匹配”模式
spring.mvc.contentnegotiation.favor-path-extension=true

# 设置只匹配已注册的后缀类型
spring.mvc.pathmatch.use-registered-suffix-pattern=true

# 通过下面属性可注册自定义的扩展名和内容类型的对应关系
spring.mvc.contentnegotiation.media-types.markdown=text/markdown

代码演示:

# 设置路径匹配时忽略检查后缀
# 该配置让“GET /users.json”能匹配GetMapping("/users")
spring.mvc.pathmatch.use-suffix-pattern=true

# 开启内容协商时的“后缀匹配”模式
spring.mvc.contentnegotiation.favor-path-extension=true

演示:通过 后缀名 来返回指定的响应类型。强制开启基于后缀匹配的内容协商

如图:
后缀为 .xml 返回的响应类型就是 xml
后缀为 .json 返回的响应类型就是 json
后缀为 .abc 乱写的,返回的响应类型就是原本不添加后缀的响应类型

在这里插入图片描述


因为后缀乱写都能匹配到,所以安全起见需要再配置一些东西

# 设置只匹配已注册的后缀类型
spring.mvc.pathmatch.use-registered-suffix-pattern=true

# 通过下面属性可注册自定义的扩展名和内容类型的对应关系
spring.mvc.contentnegotiation.media-types.markdown=text/markdown

通过配置这个 spring.mvc.pathmatch.use-registered-suffix-pattern=true,设置只匹配已注册的后缀类型后,乱写后缀就匹配不到方法了,安全性提高了一点

在这里插入图片描述


这个是自定义的拓展名:
# 通过下面属性可注册自定义的扩展名和内容类型的对应关系
# 指定 .markdown 后缀 和 text/markdown 之间的对应关系
spring.mvc.contentnegotiation.media-types.markdown=text/markdown

自定义的拓展名,不过应该是没有这个text/markdown与之对应,所以报错

在这里插入图片描述


在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_L_J_H_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值