Spring WebFlux 的 CORS 跨源资源共享 @CrossOrigin 使用教程

这两天有不少网友加我微信好友,咨询 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 使用教程

: » Spring WebFlux 的 CORS 跨源资源共享 @CrossOrigin 使用教程

原创文章,作者:dweifng,如若转载,请注明出处:https://blog.ytso.com/252218.html

(0)
上一篇 2022年5月4日
下一篇 2022年5月4日

相关推荐

发表回复

登录后才能评论