前端怎么解决跨域

news2024/11/29 8:43:38

JSONP

jsonp的原理就是利用<script>标签没有跨域限制,通过<script>标签src属性,将本地的全局函数通过callback传到服务器,服务端将接口返回数据拼凑到callback函数中,返回给客服端

实现思路 

 服务端的代码:

let express = require('express');
app = express();
app.listen('8001', () => {
  console.log('ok');
})
app.get('/list', (req,res) => {
  let { callback } = req.query;
  let data = {
    code: 0,
    message:'发送的数据'
  }
  res.send(`${callback}(${JSON.stringify(data)}`)
})

客户端代码

<script>
    let script = document.createElement('script');
    script.type = 'text/javascript';
    // 传参一个回调函数名给后端,方便后端返回时执行这个在前端定义的回调函数
    script.src = 'http://www.domain2.com:8080/login?user=admin&callback=handleCallback';
    document.head.appendChild(script);
    // 回调执行函数
    function handleCallback(res) {
        alert(JSON.stringify(res));
    }
</script>

jsonp的缺点:只能发送get一种请求。安全性低

CORS 跨域资源共享

CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。

客服端:发送请求

服务端通过配置一些头信息 Access-Control-Allow-Origin:必选

 所有的cors请求都会预先发一个options请求 发送真正请求前先发一个试探性请求

缺点是允许源只能写一个地址 或者直接写* 写*不安全并且不允许携带cookie了

nginx反向代理

不需要前端处理

http proxy

webpack 配置 webpack-dev-server配置 (node启了一个本地服务器)

devServer:{
    port:3000,
    progress:true,
    contentBase:'./bulid',
    proxy:{
        '/':{ 以/ 开头的路径都转到target路径下
            traget:'http://127.0.0.1:3001',
            changeOrigin:true
         }
    }
}

Window.postMessage

实现跨源通信,两个不同页面的脚本实现通信

A页面

<body>
  <iframe id="iframe" style="display:none" src="http://127.0.0.1:1002/MESSAGE/b.html"></iframe>
  <script>
    iframe.onload=function(){
      iframe.contentWindow.postMessage('发送的数据','http://127.0.0.1:1002')
    }
    // 监听b页面传过来的数据
    window.onmessage = function(ev){
      console.log(ev.data)
    }
  </script>
</body>

B页面

<script>
//=> 监听A发送过来的信息
window.onmessage = function(ev){
    console.log(ev.data)
    //=>ev.source:A
    ev.source.postMessage(ev.data+'@@@',ev.origin)
}
</script>

WebSocket协议跨域

WebSocket protocol是HTML5一种新的协议。它实现了浏览器与服务器全双工通信,同时允许跨域通讯

如果想完全搭建一个 WebSocket 服务端比较麻烦,又浪费时间。所以一般会使用Socket.io 这个库,

简单实现一个聊天功能:

服务端:

let express = require('express');
let app = express();
let server = require('http').createServer(app);
let io = require('socket.io')(server);
let path = require('path');
 
app.use('/', (req, res, next) => {
  res.status(200).sendFile(path.resolve(__dirname, 'index.html'));
});
 
// 开启 socket.io
io.on('connection', (client) => {
 
  // 如果有新客户端进来,显示 ID
  console.log(`客户端 ID:${client.id}`);
 
  // 监听客户端的输入信息
  client.on('channel', (data) => {
    console.log(`客户端 ${client.id} 发送信息 ${data}`);
    io.emit('broadcast', data);
  });
 
  // 判断客户端是否关闭
  client.on('disconnect', () => {
    console.log(`客户端关闭:${client.id}`);
  });
});
 
server.listen(3000, () => {
  console.log('服务监听 3000 端口');
});

客户端:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Socket.io</title>
  <script src="https://cdn.bootcss.com/socket.io/2.2.0/socket.io.slim.js"></script>
</head>
<body>
  <input type="text" id="input">
  <button id="btn">send</button>
  <div id="content-wrap"></div>
  <script>
    window.onload = function () {
      let inputValue = null;
 
      // 连接 socket.io
      let socket = io('http://localhost:3000');
      // 将创建的信息以添加 p 标签的形式展示成列表
      socket.on('broadcast', data => {
        let content = document.createElement('p');
        content.innerHTML = data;
        document.querySelector('#content-wrap').appendChild(content);
      })
 
      // 设置输入框的内容
      let inputChangeHandle = (ev) => {
        inputValue = ev.target.value;
      }
      // 获取输入框并监听输入
      let inputDom = document.querySelector("#input");
      inputDom.addEventListener('input', inputChangeHandle, false);
 
      // 当用户点击发送信息的时候,进行数据交互
      let sendHandle = () => {
        socket.emit('channel', inputValue);
      }
      let btnDom = document.querySelector("#btn");
      btnDom.addEventListener('click', sendHandle, false);
 
      // 打页面卸载的时候,通知服务器关闭
      window.onunload = () => {
        btnDom.removeEventListener('click', sendHandle, false);
        inputDom.removeEventListener('input', inputChangeHandle, false);
      }
    };
  </script>
</body>
</html>

用on监听,用emit发送一个指令。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/26520.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第七章 数学 AcWing 1533. 1 的个数

第七章 数学 AcWing 1533. 1 的个数 原题链接 AcWing 1533. 1 的个数 算法标签 数学 枚举 数位DP 思路 显然&#xff0c;直接暴力枚举时间复杂度 230(枚举N个数)∗10(枚举N个数每一位)≈10102^{30}(枚举N个数)*10(枚举N个数每一位)\approx10^{10}230(枚举N个数)∗10(枚举…

windows下通过远程桌面访问linux图形界面

一、安装epel库 epel库安装之前无法使用yum install xrdp命令安装xrdp 命令&#xff1a;yum install epel-release之后会自动匹配对应版本的rpm包&#xff0c;并解决依赖关系进行安装。 二、安装xrdp xrdp作为linux的图形化界面 1.命令&#xff1a;yum install xrdp2.开启…

【POJ No. 3368】 最频繁值 Frequent values

【POJ No. 3368】 最频繁值 Frequent values 北大OJ 题目地址 【题意】 给定n 个整数的非递减序列a 1 , a 2 ,…, an &#xff0c;对每个索引i 和j 组成的查询&#xff08;1≤i ≤j ≤n &#xff09;&#xff0c;都确定整数ai , …, aj 中的最频繁值&#xff08;出现次数最多…

Jmeter工具下载并直连MySQL数据库

优秀链接&#xff1a; Jmeter汉化 Jmeter初认识 前提有JDK&#xff0c;我的是1.8 下载Jmeter 下载的Jmeter版本是5.5无需配置Jmeter路径&#xff0c;下载后解压便可以运行 官网地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi 官网下载比较慢&#xff0c;在…

[附源码]计算机毕业设计JAVA健身健康规划系统

[附源码]计算机毕业设计JAVA健身健康规划系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

ADPCM(自适应差分脉冲编码调制)的原理和计算

关于ADPCM ADPCM(Adaptive Differential Pulse Code Modulation, 自适应差分脉冲编码调制) 是一种音频信号数字化编码技术, 音频压缩标准G.722, G.723, G.726 中都会使用到 ADPCM G.722 is an ITU-T standard 7 kHz wideband audio codec operating at 48, 56 and 64 kbit/s. …

【Linux】linux中,你不得不爱的命令集(下)

我们将要介绍的命令并不是linux中所有的命令&#xff0c;是我们常见的和经常要使用的命令。 我们所用的linux版本是centos7&#xff0c;我们的linux搭建是在腾讯云服务器上搭建的&#xff0c;借助Xshell登录服务器&#xff0c;在root下进行命令行的操作。 目录 mv指令&#x…

什么认证在云计算行业内的含金量最大?考试费用贵不贵?

作为一个新兴发展起来的技术&#xff0c;云计算在社会生产中的作用越来越重要&#xff0c;各家企业纷纷转型&#xff0c;希望能借用新技术&#xff0c;获得新的发展。这样一来市场就需要大量的新人才来维护运行&#xff0c;然而云计算作为新兴技术&#xff0c;还没有被大量引入…

野火FPGA入门(7):IP核调用

文章目录第24讲&#xff1a;快速开发的法宝&#xff1a;IP核第25讲&#xff1a;PLL-IP核的调用第26讲&#xff1a;ROM-IP核的调用rom_ctrl.vrom.v第27讲&#xff1a;RAM-IP核的调用key_filterram_crtlram第28讲&#xff1a;FIFO-IP核的调用同步FIFO异步FIFO第24讲&#xff1a;快…

Docker的四种网络模式和相关网络命令

一、Docker网络 1.实现原理 docker 使用linux 桥接&#xff0c;在宿主机虚拟一个docker 容器网桥&#xff08;docker0) &#xff0c;docker 启动一个容器时会根据docker 网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker 网桥是每个容器的…

建议别瞎卷,GitHub乱杀,MySQL DBA 攻坚指南一出,阿里数据库专家都解脱了

我先叭叭哈~ 大家可能并不觉得&#xff0c;数据库其实非常重要&#xff0c;每个业内巨头&#xff0c;每个成熟的互联网产品都有多个数据库系统&#xff0c;能保证大量并发场景下不出错&#xff0c;并非易事。尤其是银行、电商、电信、电力、航空等实时交易重要的环境中&#x…

微服务远程调用组件Feign的使用详解

一. 概要 我们知道&#xff0c;现在最火且最有技术含量的技术莫过于SpringCloud微服务了&#xff0c;所以今天百泽老师就带大家来学习一下微服务的核心的组件之一&#xff0c;Feign的基本使用及其工作机制。 二. Feign简介 1.概念 在学习Feign的使用之前&#xff0c;我们先…

贝赛尔曲线

<template><svg width"400" height"400" class"BG" mousemove"mousemove"><!-- 这样拼字符串&#xff0c;少些点加号&#xff0c;方便改一些 --><path class"Line":d"M${StartPoint[0]} ${StartP…

CNN经典模型之ALexNet、ResNet、DenseNet总结和比较

目录 ALexNet(2012 研究背景 思路和主要过程 网络模型 数据增强 主要贡献点 ResNet(2015 研究背景 思路和主要过程 Residual block(残差块)和shortcut connections(捷径连接) bottleneck block-瓶颈模块 主要贡献点: Denset(2017 研究背景 思路和主要过程 Dense…

mysql忘记密码怎么解决(几乎囊括你可能遇到的所有问题)

mysql忘记密码解决&#xff1a; 多次输入都错误&#xff0c;出现下面的提示 Access denied for user rootlocalhost (using password: YES)解决&#xff1a; 1.关闭mysql service mysqld stop2.mysql停止后输入 mysqld --shared-memory --skip-grant-tables3.重新打开一个…

利用Pinpoint搭建全链路监控系统

随着项目微服务的进行&#xff0c;微服务数量逐渐增加&#xff0c;服务间的调用也越来越复杂&#xff0c;我们急切需要一个APM工具帮我们监控各个服务的性能及对服务间的调用进行跟踪&#xff0c;而通过调研多个开源APM工具后&#xff0c;最终我们选择了Pinpoint。 简介 Pinp…

PyQt5 QDialog对话框(QMessageBox,QInputDialog,QFontDialog,QFileDialog,QColorDialog)

PyQt5 QDialog对话框QDialog类图QDialogQMessageBoxQInputDialogQFontDialogQFileDialogQColorDialogQDialog类图 QDialog import sys from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5.QtCore import Qtclass MyDialogWindow…

数据结构之插入排序

插入排序 一种思想我们所在指向位是需要进行插入的数据 我们锁指向位置前的数据是被插入的数据组 我们根据与前面的数据元素一个个比较来确定插入位置的排序 比如现在的76比前面的97小&#xff0c;97进行一个右移&#xff0c;就是赋值给data[4]&#xff08;我这里猜测是76应该是…

QT 介绍

QT 介绍 Qt是一个跨平台的 C 开发库&#xff0c;主要用来开发图形用户界面&#xff08;Graphical User Interface&#xff0c;GUI&#xff09;程序&#xff0c;当然也可以开发不带界面的命令行&#xff08;Command User Interface&#xff0c;CUI&#xff09;程序。且完全面向对…

项目实战——匹配系统(上)

ps&#xff1a;从这篇文章开始&#xff0c;整个项目最精华&#xff08;困难&#xff09;的部分就要来了&#xff0c;因此这里会把每一个步骤细分&#xff0c;并且说一下自己对于每个步骤的思考和理解&#xff08;博主水平有限&#xff0c;错误在所难免&#xff0c;欢迎指出讨论…