老生常谈的跨域处理

yizhihongxing

跨域处理是指浏览器限制页面从其他源加载资源的一种安全机制。例如,如果一个页面向外部的不同域名的接口发送Ajax请求获取数据,由于同源策略的限制,请求将会被浏览器拦截。

为了解决这个问题,我们需要采取一些跨域处理的方式。下面分别介绍几种跨域处理方案。

一、JSONP

JSONP是通过动态添加<script>标签,以请求JSON数据的一种处理方式。由于<script>标签没有“同源策略”的限制,因此可以通过动态创建script标签的方式从其他域名获取JSON数据。

JSONP的实现步骤如下:

1.在客户端定义好回调函数

function handleJSONP(data){
    console.log(data);
}

2.在客户端动态添加<script>标签

let script = document.createElement('script');
let url = 'http://api.example.com?callback=handleJSONP';
script.src = url;
document.body.appendChild(script);

3.在服务端返回JSON数据,并将数据作为参数传递给回调函数

服务端应该返回的数据格式为:

handleJSONP({key: value});

二、CORS

CORS(Cross-Origin Resource Sharing)是一个基于HTTP头部的机制。它允许服务器控制和指定允许访问该服务器资源的域名列表,从而允许跨域访问。

要使用CORS,需要在服务端开启CORS支持,主要有以下两种方式:

A、在服务端设置响应头

服务端设置响应头,允许指定的域名进行访问。

Access-Control-Allow-Origin: http://example.com

如果要让所有域名都可以访问,可以设置如下:

Access-Control-Allow-Origin: *

B、使用框架提供的方法

许多框架如Express、Koa、Spring等,都提供了便捷地设置CORS的方法。

Express:

const express = require('express')
const cors = require('cors')
const app = express()

app.use(cors({
  origin: 'http://example.com'
}))

Koa:

const Koa = require('koa');
const cors = require('@koa/cors');
const app = new Koa();

app.use(cors({
  origin: 'http://example.com'
}));

Spring:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
   @Override
   public void addCorsMappings(CorsRegistry registry) {
       registry.addMapping("/**").allowedOrigins("http://example.com");
   }
}

三、反向代理

反向代理是将客户端发起的请求转发给目标域名的方法,在目标域名进行数据请求并返回给客户端,隐藏了客户端的真实IP地址。反向代理的好处有很多,其中一点就是可以解决跨域问题。

例如:客户端请求http://example.com/api/data数据,但是此请求是跨域的,无法执行。使用反向代理,将请求发送给自己的服务端,再由服务端将请求转发到目标地址http://example.com/api/data,获取数据,并返回给客户端。这样既保留了客户端的请求方式,又解决了跨域问题。

const http = require('http');

http.createServer(function(req, res){
  const options = {
    hostname: 'example.com',
    path: '/api/data'
  };

  const p = http.request(options, function(response){
    var str = '';
    response.on('data', function(chunk){
      str += chunk;
    });
    response.on('end', function(){
      res.end(str);
    });
  });

  p.end();
}).listen(3000);

以上是三种常用的跨域处理方式,可以根据实际情况进行选择。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:老生常谈的跨域处理 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JavaScript三大变量声明详析

    JavaScript三大变量声明详析 在JavaScript中,我们经常需要声明变量来存储和操作数据。常见的变量声明有三种:var、let和const。本文将详细讲解这三种变量声明的特点和使用方法。 var var是ES5标准引入的变量声明关键字。使用var声明的变量拥有函数作用域(function scope),即在函数中声明的变量只在该函数内部有效。如果…

    JavaScript 2023年5月28日
    00
  • JavaScript中数组成员的添加、删除介绍

    JavaScript中数组成员的添加、删除介绍 JavaScript中的数组是一种特殊的对象,我们可以通过数组索引将多个值存储在其中,并可以方便地进行添加、删除等操作。 添加元素 JavaScript提供了多种向数组中添加元素的方法: 1. push() push() 方法可以在数组的末尾添加一个或多个元素,并返回数组的新长度。 let arr = [‘ap…

    JavaScript 2023年5月27日
    00
  • JavaScript中常用的几种字符串方法汇总(新手必看)

    JavaScript中常用的几种字符串方法汇总(新手必看) 在JavaScript中,字符串是非常常见的数据类型。对字符串操作可以让我们方便地进行一些逻辑处理。下面总结了常用的一些字符串方法,希望对初学者有所帮助。 1. length属性 length属性可以获取字符串的长度。 const str = "Hello World!"; co…

    JavaScript 2023年5月28日
    00
  • 通过jsonp获取json数据实现AJAX跨域请求

    使用JSONP技术实现AJAX跨域请求的步骤如下: 1.在主页面中定义一个回调函数,函数名保证唯一性。这个回调函数会接受JSON数据作为参数,并对其进行处理。 例如: function handleJsonData(data) { console.log(data); }; 2.在主页面中创建一个script标签,标签的src属性指向JSON数据请求的网址链…

    JavaScript 2023年5月27日
    00
  • js实现简单的购物车有图有代码

    让我来为大家详细讲解一下如何用js实现简单的购物车吧。 1. 确定数据结构 在开始实现购物车之前,我们需要先确定其数据结构。在此,我们可以采用一个数组来储存购物车中的商品信息,其中每个元素都是一个对象,包含商品的相关信息:名称、价格、数量等,示例代码如下: let cart = [ { name: "商品1", price: 10, qu…

    JavaScript 2023年6月11日
    00
  • JavaScript中访问id对象 属性的方式访问属性(实例代码)

    JavaScript中访问id对象属性的方式,常用的有两种方法: DOM和jQuery。下面将分别介绍这两种方法的实现。 使用DOM访问id对象属性 DOM(Document Object Model) 是一种树状结构,它把HTML文档看作是一个由节点和对象组成的树形结构,通过DOM可以对HTML文档进行访问和操作。在DOM上访问id对象属性,可以使用doc…

    JavaScript 2023年5月27日
    00
  • javascript 获取所有id中包含某关键字的控件的实现代码

    获取所有id中包含某关键字的控件,可以使用JavaScript DOM中的document.querySelectorAll()方法。该方法可以选择所有匹配指定选择器的元素,并以NodeList对象返回它们。 实现步骤: 获取页面中所有元素的ID 遍历所有ID,如果该ID包含目标关键字,则将该元素存入结果数组中 返回结果数组 以下是实现代码示例1,假设我们要…

    JavaScript 2023年6月10日
    00
  • Javascript Date getMinutes() 方法

    以下是关于JavaScript Date对象的getMinutes()方法的完整攻略,包括两个示例说明。 JavaScript Date对象的getMinutes()方法 JavaScript Date对象的getMinutes()方法返回一个表示分钟的数字(0-59)。该方法可用获取日期的分钟数。 下使用Date对象的getMinutes()方法的示例: …

    JavaScript 2023年5月11日
    00
合作推广
合作推广
分享本页
返回顶部