CORS: в запрошенном ресурсе отсутствует заголовок Access-Control-Allow-Origin - PullRequest
0 голосов
/ 29 мая 2020

Я работаю над приложением D3 - grunt-cli, в котором я сталкиваюсь с проблемой CORS при отправке почтовых запросов на сервер Fuseki.

function saveToFusekiFunc() {
    document.getElementById('fileid').click();
    document.getElementById('fileid').value = null;

    d3.select("#fileid").on("change", function() {
      var contents;
      var file = d3.select("#fileid").property("files")[0];
      console.log(file);
      var reader = new FileReader();
      reader.onload = function(e) {
      contents = e.target.result;
      console.log(contents);

    let xhr = new XMLHttpRequest();
    let url = "http://localhost:3030/Test/";

    xhr.open(
      "POST",
       url ,
      true
    );

    //xhr.setRequestHeader('Data-Type', 'jsonp');
    xhr.setRequestHeader('Content-Type', 'text/turtle;charset=utf-8');
    xhr.setRequestHeader('Access-Control-Allow-Origin', '*');
    xhr.setRequestHeader('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, DELETE, OPTIONS');
    xhr.setRequestHeader('Access-Control-Allow-Headers', 'Origin, Content-Type, X-Auth-Token');
    xhr.setRequestHeader('Access-Control-Allow-Origin', 'http://localhost:8000/');
    xhr.setRequestHeader('Access-Control-Max-Age', '86400');

    xhr.onreadystatechange = function()
    {
    if(xhr.readyState == 4 && xhr.status == 200) {
        alert(xhr.responseText);
    }
    }
    xhr.send(contents);
    };
    reader.readAsText(file);

    })


  }

Выше мой код, с помощью которого я пытаюсь сделать запрос. Это работает, только если я включаю подключаемый модуль CORS в своем расширении браузера.

Я также попытался включить доступ, внеся изменения в промежуточное ПО gruntfile. js. Но это не помогло. Из чего я почти уверен, что это проблема на стороне сервера.

Мои зависимости, как показано ниже:

"dependencies": {
    "d3": "^3.5.6",
    "grunt-cli": "^1.3.2",
    "lodash": "^4.1.0"
  }

Пробовали большинство решений, найденных в Интернете, но ничего не помогло кроме прямой блокировки проверки CORS в браузере. Я пытаюсь отправить запрос от «http://localhost: 8000 / » к серверу Fuseki «http://localhost: 3030 / ».

Ошибка, которую я получаю:

Access to XMLHttpRequest at 'http://localhost:3030/Test/' from origin 'http://localhost:8000' 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.

Заголовки запроса:

enter image description here

Также проверил в Интернете . xml файл конфигурации Fuseki, который, кажется, имеет настройки CORS:

<!-- CORS -->
  <filter>
    <filter-name>cross-origin</filter-name>
    <!-- Ported and standalone version of org.eclipse.jetty.servlets.CrossOriginFilter -->
    <filter-class>org.apache.jena.fuseki.servlets.CrossOriginFilter</filter-class>
    <!-- Defaults may be fine --> 
    <init-param>
      <param-name>allowedOrigins</param-name>
      <param-value>*</param-value>
    </init-param>
    <init-param>
      <param-name>allowedMethods</param-name>
      <param-value>GET,POST,DELETE,PUT,HEAD,OPTIONS,PATCH</param-value>
    </init-param>
    <init-param>
      <param-name>allowedHeaders</param-name>
      <param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified, Authorization</param-value>
    </init-param>
    <init-param>
      <param-name>exposedHeaders</param-name>
      <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
    </init-param>
  </filter>

Ответы [ 2 ]

1 голос
/ 31 мая 2020

Запрос CORS использовал заголовок Origin, и ответом будут заголовки, такие как Access-Control-Allow-Origin.

Код устанавливает заголовки ответа в запросе с заголовками и не имеет "Origin".

0 голосов
/ 29 мая 2020

Чтобы CORS работал, вы должны включить его на целевом сервере, в данном случае на вашем сервере Fuseki. Из Википедии выполните c на CORS :

Обратите внимание, что в архитектуре CORS заголовок Access-Control-Allow-Origin устанавливается внешней веб-службой ( service.example.com), а не исходный сервер веб-приложений (www.example.com). Здесь service.example.com использует CORS, чтобы разрешить браузеру авторизовать www.example.com для выполнения запросов к service.example.com.

Вот суть, хотя справедливое предупреждение, я не пробовал на моем сервере: https://gist.github.com/danja/e8ecbf7e51f7a2616122

...