簡體   English   中英

起源<origin>不允許訪問控制允許來源</origin>

[英]Origin <origin> is not allowed by Access-Control-Allow-Origin

XMLHttpRequest cannot load http://localhost:8080/api/test. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin. 

我閱讀了跨域 ajax 請求,並了解了潛在的安全問題。 在我的例子中,2台服務器在本地運行,並且喜歡在測試期間啟用跨域請求。

localhost:8080 - Google Appengine dev server
localhost:3000 - Node.js server

當我的頁面從節點服務器加載時,我向localhost:8080 - GAE server發出 ajax 請求。 什么是最簡單、最安全的(不想使用disable-web-security選項啟動 chrome)。 如果我必須更改'Content-Type' ,我應該在節點服務器上進行嗎? 如何?

由於它們在不同的端口上運行,它們是不同的 JavaScript origin 它們在同一台機器/主機名上並不重要。

您需要在服務器 (localhost:8080) 上啟用 CORS。 看看這個網站: http ://enable-cors.org/

您需要做的就是向服務器添加一個 HTTP 標頭:

Access-Control-Allow-Origin: http://localhost:3000

或者,為簡單起見:

Access-Control-Allow-Origin: *

如果您的服務器嘗試設置 cookie 並且您使用withCredentials = true ,請不要使用“*”

響應憑據請求時,服務器必須指定域,並且不能使用通配符。

您可以在此處閱讀有關withCredentials的更多信息

如果您需要在 Chrome 中快速解決 ajax 請求,這個 chrome 插件自動允許您通過添加正確的響應標頭從任何來源訪問任何網站

Chrome 擴展允許控制允許來源:*

您必須啟用 CORS 才能解決此問題

如果您的應用是使用簡單的 node.js 創建的

將其設置在您的響應標頭中,例如

var http = require('http');

http.createServer(function (request, response) {
response.writeHead(200, {
    'Content-Type': 'text/plain',
    'Access-Control-Allow-Origin' : '*',
    'Access-Control-Allow-Methods': 'GET,PUT,POST,DELETE'
});
response.end('Hello World\n');
}).listen(3000);

如果您的應用是使用 express 框架創建的

使用 CORS 中間件,例如

var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', "*");
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type');
    next();
}

並通過申請

app.configure(function() {
    app.use(allowCrossDomain);
    //some other code
});    

這里有兩個參考鏈接

  1. 如何允許 cors-in-express-nodejs
  2. 潛入節點-js-very-first-app #see the Ajax section

我接受@Rocket hazmat 的回答,因為它引導我找到解決方案。 它確實在我需要設置標題的 GAE 服務器上。 我必須設置這些

"Access-Control-Allow-Origin" -> "*"
"Access-Control-Allow-Headers" -> "Origin, X-Requested-With, Content-Type, Accept"

僅設置"Access-Control-Allow-Origin"給出錯誤

Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers.

另外,如果需要發送身份驗證令牌,也添加這個

"Access-Control-Allow-Credentials" -> "true"

此外,在客戶端,設置withCredentials

這會導致向服務器發送 2 個請求,其中一個帶有OPTIONS Auth cookie 不會隨它一起發送,因此需要處理外部身份驗證。

在 router.js 中,只需在調用 get/post 方法之前添加代碼。 它對我有用,沒有錯誤。

//Importing modules @Brahmmeswar
const express = require('express');
const router = express.Router();

const Contact = require('../models/contacts');

router.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
  });

如果你使用 express,你可以使用 cors 中間件如下:

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

app.use(cors())

我在使用 chrome 中的 ajax 調用跨源資源時遇到了問題。

我使用 node js 和本地 http 服務器來部署我的 node js 應用程序。

當我訪問跨源資源時收到錯誤響應

我找到了一個解決方案,

1) 我已將以下代碼添加到我的 app.js 文件中

res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");

2) 在我的 html 頁面中使用$.getJSON();

$.getJSON("http://localhost:3000/users", function (data) {
    alert("*******Success*********");
    var response=JSON.stringify(data);
    alert("success="+response);
    document.getElementById("employeeDetails").value=response;
});

將其添加到您的 NodeJS 服務器下面的導入:

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

如果之后得到 403,請將 WEB.XML tomcat 配置中的過濾器減少到以下內容:

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
</filter>

萬一有人在尋找解決方案,如果您在這里使用 express 是快速解決方案。

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

1) 使用 npm npm install cors --save

2) 導入它 [require] const cors = require('cors')

3) 將其用作中間件app.use(cors())

有關詳細信息insatll 和 cors 的用法 就是這樣,希望它有效。

我終於得到了 apache Tomcat8 的答案

您必須編輯 tomcat web.xml 文件。

可能它會在 webapps 文件夾中,

sudo gedit /opt/tomcat/webapps/your_directory/WEB-INF/web.xml

找到它並編輯它

<web-app>


<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
  <init-param>
    <param-name>cors.support.credentials</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>cors.preflight.maxage</param-name>
    <param-value>10</param-value>
  </init-param>
</filter>


<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>



</web-app>

這將允許 Access-Control-Allow-Origin 所有主機。 如果您需要將其從所有主機更改為僅您的主機,您可以編輯

<param-name>cors.allowed.origins</param-name>
<param-value>http://localhost:3000</param-value>

以上代碼從 * 到您的http://your_public_IPhttp://www.example.com

你可以參考這里Tomcat過濾器文檔

謝謝

router.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "*");
res.header("Access-Control-Allow-Headers", "*");
next();});

將此添加到您從前端調用的路線中。 例如,如果您調用http://localhost:3000/users/register ,則必須將此代碼片段添加到此路由所在的后端 .js 文件中。

對於 PHP,使用它來設置標題。

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: PUT, GET, POST");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");

嗨,這是解決節點中 CORS 問題的方法只需在 Node.js 的服務器“api”端添加這些行(或您的服務器文件),在此之前確保安裝“cors”

    const express = require('express');
    const app = express();
    app.use(express.json());
    var cors = require('cors');
    app.use(cors());

如果您的服務器是server=express()只需將server.use(cors())添加到下一行。 例如:

server.js

const express = require('express')
const cors = require('cors')
server=express()
server.use(cors())

server.get('/',(req,res)=>{
    res.send({"name":"aakash","name2":"aakash4dev"})
})
server.listen(3000)

index.html

<script>
    fetch('http://localhost:3000/')
  .then(res=> res.json())
  .then(data => console.log(data))
</script>

訪問控制允許來源

使用 dataType: 'jsonp',對我有用。

   async function get_ajax_data(){

       var _reprojected_lat_lng = await $.ajax({

                                type: 'GET',

                                dataType: 'jsonp',

                                data: {},

                                url: _reprojection_url,

                                error: function (jqXHR, textStatus, errorThrown) {

                                    console.log(jqXHR)

                                },

                                success: function (data) {

                                    console.log(data);



                                    // note: data is already json type, you just specify dataType: jsonp

                                    return data;

                                }

                            });





 } // function               

如果您使用快遞,

var express = require('express')
var cors = require('cors')
var app = express()
app.use(cors())

如果您使用的是app.use(express.json()); 服務器文件中的代碼行來解析帶有 JSON 有效負載的傳入請求,並且基於 body-parser,請記住在使用app.use(cors())代碼行之后使用它。 否則,可能會出現安全問題。 CORS

install cors package
const cors = require('cors');

app.use(cors());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM