SpringBoot跨域加SpringSecurity就失效
来自:SegmentFault , 作者:欧阳我去
链接:
作为一个后端开发 , 我们经常遇到的一个问题就是需要配置 CORS , 好让我们的前端能够访问到我们的 API , 并且不让其他人访问 。 而在 Spring 中 , 我们见过很多种 CORS 的配置 , 很多资料都只是告诉我们可以这样配置、可以那样配置 , 但是这些配置有什么区别?
1、CORS 是什么首先我们要明确 , CORS 是什么 , 以及规范是如何要求的 。 这里只是梳理一下流程 。
CORS 全称是 Cross-Origin Resource Sharing , 直译过来就是跨域资源共享 。 要理解这个概念就需要知道域、资源和同源策略这三个概念 。
- 域 , 指的是一个站点 , 由 protocal、host 和 port 三部分组成 , 其中 host 可以是域名 , 也可以是 ip ;port 如果没有指明 , 则是使用 protocal 的默认端口.
- 资源 , 是指一个 URL 对应的内容 , 可以是一张图片、一种字体、一段 HTML 代码、一份 JSON 数据等等任何形式的任何内容 。
- 同源策略 , 指的是为了防止 XSS , 浏览器、客户端应该仅请求与当前页面来自同一个域的资源 , 请求其他域的资源需要通过验证 。
2、预检请求在 CORS 中 , 定义了一种预检请求 , 即 preflight request , 当实际请求不是一个 简单请求 时 , 会发起一次预检请求 。 预检请求是针对实际请求的 URL 发起一次 OPTIONS 请求 , 并带上下面三个 headers :
- Origin:值为当前页面所在的域 , 用于告诉服务器当前请求的域 。 如果没有这个 header , 服务器将不会进行 CORS 验证 。
- Access-Control-Request-Method:值为实际请求将会使用的方法 。
- Access-Control-Request-Headers:值为实际请求将会使用的 header 集合 。
否则 , 将会请求成功 , 返回 200 的状态码 , 并带上下面这些 headers:
- Access-Control-Allow-Origin:允许请求的域 , 多数情况下 , 就是预检请求中的 Origin 的值 。
- Access-Control-Allow-Credentials:一个布尔值 , 表示服务器是否允许使用 cookies 。
- Access-Control-Expose-Headers:实际请求中可以出现在响应中的 headers 集合 。
- Access-Control-Max-Age:预检请求返回的规则可以被缓存的最长时间 , 超过这个时间 , 需要再次发起预检请求 。
- Access-Control-Allow-Methods:实际请求中可以使用到的方法集合浏览器会根据预检请求的响应 , 来决定是否发起实际请求 。
- 访问另一个域的资源 。
- 有可能会发起一次预检请求(非简单请求 , 或超过了 Max-Age) 。
- 发起实际请求 。
3、三种配置的方式Spring 提供了多种配置 CORS 的方式 , 有的方式针对单个 API , 有的方式可以针对整个应用;有的方式在一些情况下是等效的 , 而在另一些情况下却又出现不同 。 我们这里例举几种典型的方式来看看应该如何配置 。
假设我们有一个 API:
@RestControllerclass HelloController {@GetMapping("hello")fun hello(): String {return "Hello, CORS!"}}
3.1 @CrossOrigin 注解使用 @CorssOrigin 注解需要引入 Spring Web 的依赖 , 该注解可以作用于方法或者类 , 可以针对这个方法或类对应的一个或多个 API 配置 CORS 规则:
推荐阅读
- SpringBoot常用注解
- 阿里爆款SpringBoot项目实战PDF+源码+视频分享
- 全网最深分析:SpringBoot MVC自动配置失效的原因
- SpringBoot+MyBatis+MySQL读写分离实现
- 从零手写并发框架(四)异步转同步 springboot 整合
- SpringBoot配置数据源及MyBatis分页的要点
- 刷新认知!h2database在springboot中的使用
- 「尝鲜」SpringBoot 快速整合 Swagger3.0
- SpringBoot内置http编码功能为例分析自动配置过程
- SpringBoot扫描不到组件?给你提供几种方案