我了解 CORS 以及如何在服务器响应上设置适当的 Access-Control-* 标头。我发现的问题是,即使我的服务器正在响应Access-Control-Allow-Origin:*,Chrome 也拒绝接受响应。
选项请求:
OPTIONS /api/shows/1 HTTP/1.1
Host: *****
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://localhost:8888
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36
Access-Control-Request-Headers: accept, platform, version
Accept: */*
Referer: http://local host:8888/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Run Code Online (Sandbox Code Playgroud)
回复:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 0
Content-Type: */*
Content-Encoding: gzip
Expires: -1
Server: Microsoft-IIS/8.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type, Platform, Version
Access-Control-Allow-Methods: OPTIONS, TRACE, GET, HEAD, POST, PUT, DELETE
X-AspNet-Version: 4.0.30319
X-Powered-By: …Run Code Online (Sandbox Code Playgroud) 正在查看一些创建了一些Web API的节点js代码并且遇到了这个:
//CORS Middleware
app.use(function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With,
contentType,Content-Type, Accept, Authorization");
next();
});
Run Code Online (Sandbox Code Playgroud)
在互联网上环顾四周,似乎无法理解它的作用?有人可以解释一下cors中间件的目的
我是 Angular 5 的新手,我想发送 http 请求,但它在检查元素中返回 CORS 错误。
错误
XMLHttpRequest 无法加载http://example.com/account/create。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问来源“ http://localhost:4200 ”。响应的 HTTP 状态代码为 403。
下面是我的代码:
postFormData(apiUrl: string, value: Object): Observable<any> {
const body = value;
const headers = new Headers();
const utcOffset = -(new Date().getTimezoneOffset());
headers.append('Content-Type', 'application/json');
headers.append('utc-offset', utcOffset.toString());
headers.append('platform', 'WEB');
headers.append('app-version', '1.00');
headers.append('version', '1.0');
headers.append('accept', 'application/json');
headers.append('Access-Control-Allow-Origin', '*');
headers.append('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
headers.append('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
if (localStorage.getItem('user')) {
const user = JSON.parse(localStorage.getItem('user'));
headers.append('token', user.token);
headers.append('session', user.session);
}
// const options = new …Run Code Online (Sandbox Code Playgroud) 我想用 CORS 保护我的 API。我希望我的 API 只能从选定的域进行调用访问。
我正在使用 node.js 和 express,所以我添加到我的项目中:https : //github.com/expressjs/cors
和示例代码:
var express = require('express')
var cors = require('cors')
var app = express()
var corsOptions = {
origin: 'http://example.com',
optionsSuccessStatus: 200
}
app.get('/test', cors(corsOptions), function (req, res, next) {
res.json({msg: 'This is CORS-enabled for only example.com.'})
})
Run Code Online (Sandbox Code Playgroud)
但是,如果我通过 POSTMAN 从本地主机发出请求,我仍然会从该路由中得到响应。这应该被阻止并且只适用于来自一个域(example.com)的请求。
我之前试过:
router.get('/test', cors(corsOptions), function(req, res, next) {
console.log(corsOptions);
res.header("Access-Control-Allow-Origin", "http://www.example.com);
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.status(200).send({ work: true });
});
Run Code Online (Sandbox Code Playgroud)
但这也让我对邮递员的要求...
我想要一个 API,只有当它涉及到我的 example.com 页面并且来自 JavaScript 发送的请求时才能被引用。
拥有一个生成 JSON 的 Perl Catalyst 应用程序,我需要在由 Apache 服务器提供服务的 HTML 页面中使用 jQuery 读取该 JSON 内容。Catalyst 和 Apache 两个应用程序都在同一台主机上运行。
当我从 Apache 访问 Catalyst URL 时出现错误
Access to XMLHttpRequest at 'http://localhost:3000/abc/json_list' from origin 'http://localhost:8888' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Run Code Online (Sandbox Code Playgroud)
正如我在许多主题中所说的那样,必须设置一个标题(或更多)。在这种情况下,必须设置催化剂,但我不知道如何设置。
任何提示?
I am tyring to add code to get the ipaddress of the user on my site. I am using a react(mobx/mst) with axios.
getIpAddress: flow(function*() {
const response = yield axios.get('http://api.ipify.org/?format=text');
self.ipAddress = response.data;
})
Access to XMLHttpRequest at 'http://api.ipify.org/' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource
Run Code Online (Sandbox Code Playgroud) 我正在创建一个Chrome扩展程序,它将与特定的热门网站进行交互.
它将html注入网站,增加了新功能.这些功能的一部分取决于用户的登录,为了获取登录的用户信息,我们需要使用此网站的OAuth身份验证API对扩展进行身份验证.
例如,让我们说流行的网站(显然我们不拥有)是www.github.com.
当用户在www.github.com上时,我们的扩展会在网站上注入一个"与GitHub连接"的按钮.
单击该按钮时,弹出窗口将打开Githubs OAuth API,并询问用户:'您是否要让应用程序XYZ访问您的GitHub帐户?是/否'.
一旦他们点击是,我们的扩展程序将通过身份验证,现在可以使用GitHub API访问用户名等信息,并将其直接注入github.com网站.
所有这些都是我们希望它工作的方式,但问题是我们在当前窗口(www.github.com)和我们自己的服务器(www.server.com)的弹出窗口之间进行通信时遇到很多困难.
在弹出窗口中发生的Oauth成功回调,返回令牌,我们无法将其传回主页面,因为'协议,域和端口'不匹配.
从弹出式oauth成功窗口中捕获该令牌的最佳方法是什么,以便我们可以在我们的扩展中使用此令牌,该扩展位于另一个域中?
我试图在JQuery中的服务器上发出一个简单的GET请求.
$.ajax({
headers: {
"Authorization": "Basic " + btoa("hello" + ":" + "world")
},
url: "http://hello.world?Id=1",
method: "GET",
success: function () {
},
}).then(function () {
});
Run Code Online (Sandbox Code Playgroud)
问题是,当请求被发送时,身份验证标头不会正确地放入请求中:
Host: hello.world
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: GET
Access-Control-Request-Headers: authorization
Origin: null
Connection: keep-alive
Cache-Control: max-age=0
Run Code Online (Sandbox Code Playgroud) 我希望这个问题不是太模糊,但我觉得我错过了一些基本的东西。这就是我所处的情况。我们有一个胖客户端应用程序,它在每个用户的本地计算机 (Windows 7) 上运行,并提供一个 JavaScript API 来与应用程序交互。我们有一个托管在服务器上的 Web 应用程序,但向 localhost 发出 AJAX 请求以与胖客户端 JS API 交互。
在一台机器上,我们加载 Web 应用程序。对 localhost 发出的所有 AJAX 请求都是在没有 OPTIONS 预检请求的情况下发出的。JS 控制台的 net 选项卡显示正在制作的 POST,并且响应成功(我可以告诉胖客户端在响应中包含哪些标头,包括所有必要的 CORS 标头)。
在另一台机器上,我们从同一台服务器加载 Web 应用程序。但是,当向本地主机发出 AJAX 请求时,会发出(预期的)OPTIONS 请求。不幸的是,胖客户端没有响应适当的 Access-Control-Allow-Origin 标头,因此不允许进行后续的 POST。
浏览器无关紧要,我们已经测试了最新版本的 Firefox 和 Chrome,我们总是从机器上得到相同的行为。我们已经在 4 台机器上进行了测试——2 台发送 OPTIONS,2 台只发送没有前面 OPTIONS 的 POST。似乎由浏览器决定 AJAX 目标是否与源不同以及它是否发送预检请求。我终生无法弄清楚为什么我的机器不发送任何 OPTIONS 请求,即使 AJAX 请求(到 localhost 或 lvh.me)是与网页源不同的主机/域,但从另一台机器加载相同的页面确实会产生它们。
是否有某种浏览器设置会影响这一点?还是 Windows 设置?为什么我们会在这方面看到不同的行为?
更新1:
为了简化和澄清,我有两台机器,machineA 和 machineB。两台机器都从远程服务器 example.com 加载 Web 应用程序。两台机器都在它们的本地机器上安装了一个完整的厚应用程序,提供了一个 Web 服务器和 API。从example.com 加载的Web 应用程序包含用于向本地主机提交AJAX 请求的JavaScript 代码,以便每个用户都可以与他们自己的胖客户端应用程序本地实例进行交互。由于 localhost …
我可以构建和服务Angular 5项目ng serve并在我的浏览器中查看它.我想将文件移到docker容器上,因为我的最终应用程序需要有一个php后端.
当我将运行的同一文件系统移动ng serve到docker build并尝试导航到它时,我收到服务器错误.
我知道容器正常工作,因为我可以将PHP文件提供给相应localhost端口的浏览器而不会出现任何问题.所以它需要与Angular一起导致错误.
我注意到ng new angular-tour-of-heroes项目在根项目目录中没有index.html.当我将src/文件夹中的那个移动到根目录时,我仍然没有在浏览器中获得任何内容.
如何使用Docker而不是ng serve?提供Angular应用程序?