本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
这两天有不少网友加我微信好友,咨询 WebFlux 相关的教程。
而我之前也写过一系列相关的教程,但是那些教程至今已经有一段时间了。很多网友已经开始用上 WebFlux 了,为了减少大家的咨询,我再继续更新一些相关的教程!
今天,我们来说一说 WebFlux 中的跨域问题。
出于安全原因,浏览器禁止 AJAX 调用当前来源以外的资源。而我们往往有这样的场景,于是 CORS 诞生了。
跨域资源共享(CORS)是 由大多数浏览器实现的 W3C 规范,可让您指定授权哪种类型的跨域请求,而不是使用基于 IFRAME 或 JSONP 的安全性较低且功能较弱的变通办法。
Spring WebFlux HandlerMapping 实现提供对 CORS 的内置支持。并且提供了一个 @CrossOrigin 注解,这个注解可以作用在类上,也可以作用在方法上。
@RestController
@RequestMapping("/xttblog")
public class XttblogController {
@CrossOrigin
@GetMapping("/{id}")
public Mono<Account> retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public Mono<Void> remove(@PathVariable Long id) {
// ...
}
}
默认情况下,@CrossOrigin 允许所有请求源,允许所有 headers,允许所有控制器方法能够映射到的所有 HTTP 方法。
@CrossOrigin 注解中有 7 个参数,作用分别如下:
- origins:允许可访问的域列表
- maxAge:准备响应前的缓存持续的最大时间(以秒为单位),默认30分钟
- allowedHeaders:允许请求头重的header,默认都支持
- exposedHeaders:响应头中允许访问的header,默认为空
- methods:请求支持的方法,例如”{RequestMethod.GET, RequestMethod.POST}”}。默认支持RequestMapping中设置的方法
- allowCredentials:是否允许cookie随请求发送,使用时必须指定具体的域
- value:作用和origins一样
@CrossOrigin 除了可以作用在类上外,还可以作用在方法上。
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/xttblog")
public class XttblogController {
@CrossOrigin("https://domain2.com")
@GetMapping("/{id}")
public Mono<Account> retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public Mono<Void> remove(@PathVariable Long id) {
// ...
}
}
从上面可以看出,@CrossOrigin 注解的作用在 WebFlux 中和在 SpringMVC 中是一样的。
所以,认真的看官方文档,你会发现 Spring 家族中的很多东西用法都一样,比如我们后面要讲的 CorsConfiguration 全局配置功能!
参考资料
- https://caniuse.com/#feat=cors
- https://www.w3.org/TR/cors/
- https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-cors
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » Spring WebFlux 的 CORS 跨源资源共享 @CrossOrigin 使用教程