这两天有不少网友加我微信好友,咨询 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
: » Spring WebFlux 的 CORS 跨源资源共享 @CrossOrigin 使用教程
原创文章,作者:dweifng,如若转载,请注明出处:https://blog.ytso.com/tech/java/252218.html