跨域问题详解

536 阅读3分钟

跨域

跨域详解!前后端分离解决跨域问题_iqqcode的博客-CSDN博客_前后端分离为什么会出现跨域

跨域问题是什么

由于浏览器的同源策略限制

1.Cookie只能在当前域名下生效

2.同源策略(Same-Origin-Policy)是一种约定,它是浏览器最核心、最基本的安全功能。如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的JavasSript脚本和另外一个域的内容进行交互。

服务器之间的请求是不存在跨域问题的!

同源(即指在同一个域):两个页面具有相同的协议(protocol),主机(host)和端口号(port)

  • 协议相同
  • 域名相同
  • 端口相同

解决方案

Jsonp前后端配合

JSONP 是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,兼容性好(兼容低版本IE)

【缺点】

  • 只支持get请求,不支持post请求
  • 只支持跨域HTTP请求

【核心思想】

网页通过添加一个<script>元素,向服务器请求 JSON 数据,服务器收到请求后,将数据放在一个指定名字的回调函数的参数位置传回来。

CORS

CORS是一种W3C标准,全称是"跨域资源共享(Cross-origin resource sharing)"。它允许浏览器向跨源服务器发出XMLHttpRequest请求,从而克服了同源使用的限制。

实现CORS很简单,就是在服务端加一些响应头,对前端来说是无感知的。

详解响应头 Access-Control-Allow-Origin

该字段必填 它的值要么是请求时Origin字段的具体值,要么是一个*,表示接受任意域名的请求。 Access-Control-Allow-Methods

该字段必填 它的值是逗号分隔的一个具体的字符串或者*,表明服务器支持的所有跨域请求的方法。注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次"预检"请求。

SpringBoot

【方式一】全局配置

        registry.addMapping("/**") // 所有的当前站点的请求地址,都支持跨域访问
                .allowedOrigins("*") // 所有的外部域都可跨域访问。 如果是localhost则很难配置,因为在跨域请求的时候,外部域的解析可能是localhost、127.0.0.1、主机名
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS") // 当前站点支持的跨域请求类型是什么
                .allowCredentials(true) // 是否支持跨域用户凭证
                .maxAge(3600) // 超时时长设置为1小时。 时间单位是秒。
                .allowedHeaders("*"); //获取所有请求头字段

【方式二】@CrossOrigin

 @CrossOrigin(origins = "http://localhost:8181")

Nginx反向代理解决跨域问题

nginx作为反向代理服务器,就是把Http请求转发到另一个或者一些服务器上。通过把本地一个url前缀映射到要跨域访问的web服务器上,就可以实现跨域访问。