1、什么跨域
首先,在前后端没有分离项目,例如jsp、php,前后台代码没有实现物理上的分离。不存在跨域问题。前后端分离后,前后端的地址域名不同,而同源策略导致浏览器会拦截a地址访问b地址请求(a地址通过浏览器访问b地址,叫跨域COSR),其中同源策略设计出于安全的考虑。前后分离之后就会产生跨域问题,为了解决这个问题,浏览器在发起跨域请求的时候会先发送一个预检请求(option请求),服务器通过设置CORS 来指定允许跨域请求,并指定请求源以及方法 和 请求头等信息。
2、预检请求
需预检的请求要求必须首先使用 OPTIONS 方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。预检请求 的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。
-
Access-Control-Request-Method:该字段是必须的,用来列出浏览器的 CORS 请求会用到哪些 HTTP 方法,
-
Access-Control-Request-Headers:该字段是一个逗号分隔的字符串,指定浏览器 CORS 请求会额外发送的头信息字段,
-
access-control-allow-origin:在上述例子中,表示 https://xxx.cn 可以请求数据,也可以设置为* 符号,表示统一任意跨源请求
-
Access-Control-Max-Age 该字段可选,用来指定本次预检请求的有效期,单位为秒。在有效期间,不用发出另一条预检请求
例如下面截图
3、跨域配置
如果你的前端是通过nginx 转发请求你的后端接口,nginx也要配置跨域,如下面截图
然后在后端项目中进行跨域配置
方法一、 实现WebMvcConfigurer 接口跨域配置的方法,截图如下
方法二 、通过过滤器实现,截图如下
方法三、通过注解实现,如下截图
注解可以定义在方法和类,可以实现最小颗粒度的控制。
方法四 、通过配置FilterRegistrationBean实现,截图如下
此方法是通过配置spring过滤器实现,而不是servlet