跨域

简介: 跨域问题在Web开发中较为常见,开发人员需要根据具体的项目需求和场景选择合适的跨域解决方案。在实际应用中,CORS和代理服务器是比较常用的方法,而JSONP和WebSockets则适用于一些特定的业务场景。

跨域是指浏览器从一个域名的网页去请求另一个域名下的资源时,由于浏览器的同源策略,导致请求被限制的一种现象。以下是关于跨域的详细介绍:

同源策略

  • 定义:同源策略是浏览器的一种安全机制,它限制了一个源的文档或脚本如何与另一个源的资源进行交互。同源指的是协议、域名、端口号都相同,如果有任何一项不同,就会产生跨域问题。
  • 目的:主要是为了防止恶意网站通过脚本等方式获取用户在其他网站的敏感信息,保障用户的信息安全和网站的正常运行。

跨域的常见场景

  • 不同域名:例如,一个网站的页面位于http://www.example1.com,而它需要请求http://www.example2.com下的接口数据,这就属于跨域请求。
  • 不同子域名:即使是主域名相同,但子域名不同,如http://sub1.example.comhttp://sub2.example.com之间的请求,也会产生跨域问题。
  • 不同端口:如http://www.example.com:8080http://www.example.com:3000发送请求,由于端口不同,同样会被视为跨域请求。
  • 不同协议http://www.example.comhttps://www.example.com之间的请求也会受到同源策略的限制,产生跨域问题。

跨域解决方案

  • JSONP
    • 原理:利用<script>标签不受同源策略限制的特点,通过动态创建<script>标签,将跨域请求的URL作为src属性的值,并在URL中添加一个回调函数名作为参数。服务器收到请求后,会将数据包装在这个回调函数中返回,浏览器在接收到响应后会自动执行回调函数,从而实现数据的获取。
    • 示例
      <script>
      function handleData(data) {
              
      console.log(data);
      }
      var script = document.createElement('script');
      script.src = 'http://www.example2.com/api/data?callback=handleData';
      document.getElementsByTagName('head')[0].appendChild(script);
      </script>
      
    • 局限性:只能用于GET请求,并且需要服务器端的支持,对服务器的改动较大。
  • CORS
    • 原理:跨域资源共享(CORS)是一种基于HTTP头的机制,它允许服务器明确指定哪些源可以访问其资源。服务器通过在响应头中设置Access-Control-Allow-Origin等字段来控制跨域访问。
    • 示例:服务器端设置响应头:
      app.use((req, res, next) => {
             
      res.setHeader('Access-Control-Allow-Origin', '*');
      res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
      res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
      next();
      });
      
    • 优势:支持多种HTTP请求方法,是目前比较常用的跨域解决方案,对客户端的改动较小,安全性相对较高。
  • 代理服务器
    • 原理:在客户端和目标服务器之间设置一个代理服务器,客户端先将请求发送到代理服务器,代理服务器再将请求转发到目标服务器,并将目标服务器的响应返回给客户端。由于客户端和代理服务器属于同源,因此避免了跨域问题。
    • 示例:在开发环境中,可以使用Webpack的devServer.proxy配置来设置代理服务器:
      module.exports = {
             
      //...其他配置
      devServer: {
             
      proxy: {
             
      '/api': {
             
        target: 'http://www.example2.com',
        changeOrigin: true,
        pathRewrite: {
             
          '^/api': ''
        }
      }
      }
      }
      };
      
    • 适用场景:适用于开发环境和一些对安全性要求较高的场景,但需要额外配置和维护代理服务器。
  • WebSockets
    • 原理:WebSockets是一种全双工通信协议,它在客户端和服务器之间建立了一个持久的连接,通过该连接可以进行双向数据传输。由于WebSockets的连接不受同源策略的限制,因此可以用于跨域通信。
    • 示例:客户端代码:
      const socket = new WebSocket('ws://www.example2.com/ws');
      socket.addEventListener('open', function (event) {
             
      socket.send('Hello Server!');
      });
      socket.addEventListener('message', function (event) {
             
      console.log('Received:', event.data);
      });
      
    • 特点:适用于实时性要求较高的应用场景,如在线聊天、实时数据更新等,但需要服务器端支持WebSockets协议。

跨域问题在Web开发中较为常见,开发人员需要根据具体的项目需求和场景选择合适的跨域解决方案。在实际应用中,CORS和代理服务器是比较常用的方法,而JSONP和WebSockets则适用于一些特定的业务场景。

相关文章
|
安全 网络安全 数据安全/隐私保护
【计算机网络】URL概念及组成
【计算机网络】URL概念及组成
Echarts手机端无刷新实现图表自适应横屏和竖屏的解决方案
Echarts手机端无刷新实现图表自适应横屏和竖屏的解决方案
914 0
|
JavaScript
搭建Vue3组件库:第四章 使用Vitepress搭建文档网站
文档建设一般会是一个静态网站的形式 ,这次采用 Vitepress 完成文档建设工作。 Vitepress 是一款基于Vite 的静态站点生成工具。开发的初衷就是为了建设 Vue 的文档。Vitepress 的方便之处在于,可以使用流行的 Markdown 语法进行编写,也可以直接运行 Vue 的代码。也就是说,它能很方便地完成展示组件 Demo 的任务。
2343 0
搭建Vue3组件库:第四章 使用Vitepress搭建文档网站
|
Web App开发 JavaScript 开发者
跨域处理
跨域处理
277 0
理解 Go 语言中的 select 用法
本文深入解析了Go语言中`select`的用法,它类似于`switch case`,但仅用于通道(channel)的操作。文章通过多个示例说明了`select`的基本用法、避免死锁的方法、随机性特点以及如何实现超时机制。同时总结了`select`与`switch`的区别:`select`专用于通道操作,case执行是随机的,需注意死锁问题,且不支持`fallthrough`和函数表达式。
447 1
理解 Go 语言中的 select 用法
|
安全 网络协议
http协议的有效字符
HTTP协议中有效的字符集主要是ASCII字符,包括字母、数字、保留字符、子定界符,以及一些需转义的不安全字符。使用这些字符时,应该保证正确的编码和字符集的使用,以维护HTTP交流的准确性和安全性。当处理URI和构建HTTP请求时,对特殊字符进行适当的编码是至关重要的,以确保信息的无误传达和服务器的正确理解。在现代的网络通讯中,这些细节成为了保障交互效率和系统安全的基石。
943 0
|
SQL 缓存 JavaScript
深入解析JavaScript中的模板字符串
深入解析JavaScript中的模板字符串
527 1
|
Java API PHP
使用oss服务上传/下载对象
使用oss服务上传/下载对象
1427 2
|
安全
什么是跨域,为什么会跨域?
什么是跨域,为什么会跨域?
953 1