客户端与服务器对话时如何克服“Access-Control-Allow-Origin”错误

2023-11-30

因此,我正在使用 swiip 的一个 yeoman 项目,名为 Generator-gulp-Angular - 只需执行“npm search gulp-Angular”,您就会看到它。

开箱即用的客户端从 127.0.0.1:3000 运行,我希望对 127.0.0.1:8080 上的 (python) 服务进行 $http 调用。它使用浏览器同步进行实时重新加载,并使用代理中间件进行从客户端到服务器的代理调用。代理中间件默认处于禁用状态,因此技巧是启用它并成功向服务器发出请求并从服务器接收响应。到目前为止我还没有能够成功启用它:-(

更新:我遵循“给自己一个简单的例子”的座右铭重新创建了 yeoman 项目,以便集中精力解决访问控制问题,并且我让它或多或少开箱即用,而无需修改服务器逻辑为了允许跨源请求。令人高兴的是,它就像说明所描述的那样简单。这是扩展 gulp 中间件以执行代理的代理文件,或者更确切地说,从客户端到服务器的映射:

 /*jshint unused:false */

/***************

  This file proxy.js allows you to configure a proxy system plugged into BrowserSync
  in order to redirect backend requests while still serving and watching
  files from the web project

  IMPORTANT: The proxy is disabled by default.

  If you want to enable it, watch at the configuration options and finally
  change the `module.exports` at the end of the file

***************/

'use strict';

var proxyMiddleware = require('http-proxy-middleware');

var options = {
  target: 'http://127.0.0.1:8080'
};

var proxy = proxyMiddleware('/quote', options);

module.exports = function(){
  return [proxy];
}

从 gulpfile (gulpfile.js) 我们有:

'use strict';

var gulp = require('gulp');
var browserSync = require('browser-sync');
var browserSyncSpa = require('browser-sync-spa');

var util = require('util');

var middleware = require('./proxy');

module.exports = function(options) {

  function browserSyncInit(baseDir, browser) {
    browser = browser === undefined ? 'default' : browser;

    var routes = null;
    if(baseDir === options.src || (util.isArray(baseDir) && baseDir.indexOf(options.src) !== -1)) {
      routes = {
        '/bower_components': 'bower_components'
      };
    }

    var server = {
      baseDir: baseDir,
      routes: routes
    };

    
    // 
    // Here's the relevant bit
    //
    server.middleware = middleware();

    browserSync.instance = browserSync.init({
      startPath: '/',
      server: server,
      browser: browser
    });
  }

  browserSync.use(browserSyncSpa({
    selector: '[ng-app]'// Only needed for angular apps
  }));

  gulp.task('serve', ['watch'], function () {
    browserSyncInit([options.tmp + '/serve', options.src]);
  });

  ..
  
  gulp.task('serve:e2e-dist', ['build'], function () {
    browserSyncInit(options.dist, []);
  });
};

正如您所看到的,我们正在配置 gulp 以了解在客户端上使用时的“/quote”上下文(http://localhost:3000/quote)将被映射到后端(http://localhost:8080/quote) - 了解更多信息:https://github.com/chimurai/http-proxy-middleware/blob/v0.0.5/README.md

这是我们使用 $http 服务在客户端上进行调用的地方:

function quotePriceGenerator($q, $http) {
  var lowPrice = 1.45000, highPrice = 1.47000;
  var askPrice, sellPrice;
  var service = {};
  service.getPrice = function() {
    var deferred = $q.defer();
    $http({
      url: '/quote',
      method: 'GET'
    })
    .then(function(quote) {
      var date = new Date();
      const quoteZoom = 100000;
      const quotePipsWindow = -3;
      ..
      qBox['trading-size-string'] = qBox['trading-size'].toString();
      service.qBox = qBox;
      return deferred.resolve(service);
    });
    // Returns a random integer between min (included) and max (included)
    // Using Math.round() will give you a non-uniform distribution!
    function getRandomIntInclusive(min, max) {
      return Math.floor(Math.random() * (max - min + 1)) + min;
    }
    return deferred.promise;
  };
  return service;
  ..
  function randomizeAskSell(low, high){

  }
}



quotePriceGenerator.$inject = ['$q', '$http'];
export default quotePriceGenerator;

后端是一个 python 龙卷风 REST API,不需要任何 Access-Control-Allow-Origin 配置。这里是:

from __future__ import division
import tornado.ioloop
import pyrestful.rest
import random

from pyrestful import mediatypes
from pyrestful.rest import get

class Quote(object):
  quote_date_time = float
  ..
  sell_price = float
  trading_size = int

class QuoteResource(pyrestful.rest.RestHandler):
  @get(_path="/quote", _produces=mediatypes.APPLICATION_JSON)
  def getQuoteJson(self):
    price_min = random.randint(145000,146000)/100000
    price_max = random.randint(146000,147000)/100000
    ..
    quote.sell_price = sell_price
    quote.trading_size = trading_size
    return quote

if __name__ == "__main__":
  try:
    print("Start the service")
    app = pyrestful.rest.RestService([QuoteResource])
    app.listen(8080)
    tornado.ioloop.IOLoop.instance().start()
  except KeyboardInterrupt:
    print("\nStop the service")

有关错误请求/响应的一些信息也会有所帮助。

您可以尝试设置changeOrigin参数为 true。这将修改请求的主机标头以匹配服务器的主机名。

var proxyMiddleware = require('http-proxy-middleware');

var options = {
  target: 'http://127.0.0.1:8080',
  changeOrigin: true         // <-- changeOrigin
};

如果这不起作用;你可以添加Access-Control-Allow-Origin响应的标头:

var proxyMiddleware = require('http-proxy-middleware');

var options = {
  target: 'http://127.0.0.1:8080',
  onProxyRes: function (proxyRes, req, res) {
    proxyRes.headers['Access-Control-Allow-Origin'] = '*';
  }
};

http 代理中间件onProxyResv0.5.0 中添加了该选项,因此如果您仍在使用 v0.0.5,请务必更新它

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

客户端与服务器对话时如何克服“Access-Control-Allow-Origin”错误 的相关文章

随机推荐

  • 当我编译这段代码时发生错误C6308,说realloc可以返回NULL,并且可能导致内存泄漏

    void inf int Sub const char num const unsigned int index if this gt length lt index this gt digits char realloc this gt
  • 结构体变量初始化

    我尝试按如下方式初始化结构变量 struct Abc char str 10 int main struct Abc s1 s1 str Hello error 我可以理解这种行为 因为它与 char str 10 str Hello in
  • 使用Java API将数据上传到HDFS

    我已经搜索了一段时间 但似乎没有一个解决方案适合我 非常简单 我想使用 Java API 将数据从本地文件系统上传到 HDFS Java 程序将在已配置为通过 shell 与远程 Hadoop 集群通信的主机上运行 即hdfs dfs ls
  • ggplot2:如何动态包装/调整大小/重新缩放 x 轴标签,使其不会重叠

    我正在尝试实现一种包装 x 轴标签的解决方案 以便它们不会重叠 我知道这个问题已经被问过好几次了 并且有一些好的答案 但是 我见过的解决方案都没有回答如何随着情节的发展重新包装标签resized SO 的三个不同答案让我相信这是可以实现的
  • Mac 上的 SWT 问题

    我有一个使用 SWT UI 的 java 项目 但在任何 Mac OS X 计算机上部署它时遇到了问题 当程序从 Eclipse 中或从 jar 文件运行时 它本身可以在 Windows 上完美运行 在 Mac 上 该程序在 Eclipse
  • MongoDB:是否可以进行不区分大小写的查询?

    Example gt db stuff save foo bar gt db stuff find foo bar count 1 gt db stuff find foo BAR count 0 你可以使用regex 在你的例子中 这将是
  • 从linux命令行创建word doc文件

    我有一些 HTML 文件需要以 MS Word 文档格式分发 不要问 我可以在 OpenOffice 中手动打开每个文件 然后另存为 doc 文件 但我有很多文件 所以我想自动执行此操作 你知道一个方法吗 没有测试过 但是有pyuno访问
  • 将大小写切换到/之间

    Javascript 有没有一种方法可以通过 switch case 结构将一个整数与另一个整数进行比较 而不使用 if 语句 E g switch integer case 1 to 10 break case 11 to 20 brea
  • Mpi 在 Windows 中的使用

    我将 mpi 安装到 Windows 中 并且可以使用它的库 问题是 当我在 Windows 中编写时 mpiexec n 4 proj exe 进入命令提示符后 它不会进行正确的操作 4个不同的进程分别使用整个代码文件 它们的行为不像仅在
  • C# 并行运行多个非阻塞外部程序

    我需要从我的应用程序运行外部可执行文件的多个实例 该可执行文件的平均运行时间约为 3 分钟 我想重定向这些进程的输出 并更新 GUI 中的进度条 当然 我不想等到他们回来才能继续使用我的应用程序 我认为我应该为每个实例创建一个线程 并在线程
  • Ms Access 多选列表框移动器

    我有两个列表框 lfmVocabulary 和 lfmVocabularyAssign 它们都与表单没有绑定 我在实现代码设计的某些方面遇到了困难 到目前为止 我可以通过查询记录集使用值填充第一个列表表单 但我无法将项目从一个框传输到另一个
  • 无法解析 javax.xml.stream.XMLStreamReader 类型

    无法解析 javax xml stream XMLStreamReader 类型 它是从所需的 class 文件间接引用的 我在一行中收到此错误 我缺少哪个 jar javax xml stream XMLStreamReader在 Jav
  • 在 SQL Server XML 处理中参数化 XPath 以便修改()

    正如标题所示 我尝试参数化 SQL Server 中 XML 数据列的 edit 方法的 XPath 但遇到了一些问题 到目前为止我有 DECLARE newVal varchar 50 DECLARE xmlQuery varchar 5
  • 将外部js注入到自己创建的iframe中

    所以我试图将外部 css 和 js 注入到自己创建的 iframe 中以提供额外的安全层 因此不存在跨域问题 这是代码
  • 如何使用 POP3 检索 Gmail 子文件夹/标签?

    下面的代码使用javamail API来访问gmail String host pop gmail com int port 995 Properties properties new Properties properties put m
  • 从 Xcode 启动 iOS 模拟器并出现黑屏,然后 Xcode 挂起且无法停止任务

    我在 iOS 模拟器中运行基本 iPhone 应用程序时遇到问题 在阅读斯坦福 iTunes CS193p 讲座时 我已经搜索了一段时间 Google 和 SO 但到目前为止找不到解决方案 类似的错误还有很多 但解决方案似乎并不能解决这个问
  • cor.test() 的矩阵版本

    Cor test 需要向量x and y作为参数 但我有一个完整的数据矩阵 我想成对地测试 Cor 将此矩阵作为参数就好了 我希望找到一种方法来为cor test 其他人的常见建议似乎是使用cor prob https stat ethz
  • Jquery 旋转 div [重复]

    这个问题在这里已经有答案了 我无法旋转 div 控制台中没有警告或错误 您可以查看JSFiddle 版本在这里 我使用的代码是 div2 click someFunction2 function someFunction2 div2 ani
  • 禁用 HTML5 范围输入的跟踪

    我正在尝试找到一种方法来阻止用户单击 HTML5 范围输入的 轨道 部分 本质上 我只希望用户能够使用 句柄 来更改范围值 这可能吗 至少在 chrome 上可以通过指针事件实现 input type range pointer event
  • 客户端与服务器对话时如何克服“Access-Control-Allow-Origin”错误

    因此 我正在使用 swiip 的一个 yeoman 项目 名为 Generator gulp Angular 只需执行 npm search gulp Angular 您就会看到它 开箱即用的客户端从 127 0 0 1 3000 运行 我