跨域问题

跨域(Cross-Origin)指的是在Web开发中,浏览器的同源策略(Same-Origin Policy)下,一个网页的JavaScript代码试图访问不同源(不同域、不同协议或不同端口)的资源时所发生的情况。浏览器的同源策略:

  • 当一个网页上的JavaScript代码尝试访问不同源的资源时,浏览器会在请求头中添加一个Origin字段,指示请求的源。然后服务器就可以对跨域的请求做出对应的反应。
  • 处理Cookie:如果发送给服务器的请求是跨域的,那么浏览器默认不允许此请求携带cookie,如果需要在跨域请求中发送Cookie,服务器需要设置Access-Control-Allow-Credentials头为true,并且浏览器发起请求时需要设置withCredentials选项为true。

跨域主要是为了防止恶意网站获取敏感信息。

CORS解决跨域问题的步骤: 简单来说,就是浏览器会告诉服务器这个请求是跨域的,如果你允许的话,就在响应的头部加上对应的字段来告诉我。

  • 浏览器发起跨域请求:当一个网页上的JavaScript代码尝试访问不同源的资源时,浏览器会在请求头中添加一个Origin字段,指示请求的源。
  • 目标服务器响应CORS头:目标服务器接收到请求后,会检查请求中的Origin字段,并决定是否允许该请求。如果目标服务器允许跨域访问,它会在HTTP响应头中添加一些CORS相关的头信息,如Access-Control-Allow-Origin,来指定允许的源。
  • 浏览器检查响应头:浏览器会检查目标服务器的响应头,特别是Access-Control-Allow-Origin头。如果这个头中包含了请求源的信息(或是*,表示允许所有源),浏览器会允许JavaScript访问响应的数据。如果没有得到授权,浏览器将阻止JavaScript访问响应数据,从而实现了跨域访问的控制。
  • 处理复杂请求:对于一些特殊类型的跨域请求,如带有自定义头信息、使用HTTP方法为PUT或DELETE等,浏览器会在发送实际请求之前进行一个预检请求(Preflight)来确认目标服务器是否接受这种类型的请求。预检请求包含一个OPTIONS方法,目标服务器会响应,并指定是否允许实际请求。
  • 处理凭证(Credentials):如果请求需要发送凭证,如Cookie或HTTP身份验证信息,目标服务器还需要设置Access-Control-Allow-Credentials头为true,并且浏览器在发起请求时需要设置withCredentials选项为true。

代理服务器解决跨域:同一域内设置一个中间服务器(代理服务器),让客户端的请求先发送到代理服务器,然后由代理服务器再将请求发送到目标服务器,最后将目标服务器的响应返回给客户端。这样做的好处是,客户端与代理服务器在同一域内,不受同源策略的限制,而代理服务器与目标服务器之间也不受跨域限制,因此可以顺利完成跨域请求。

posted @ 2023-09-30 17:35  好人~  阅读(9)  评论(0编辑  收藏  举报