Почему я вижу, что ошибка "источник не разрешена с помощью Access-Control-Allow-Origin" здесь?

Я вижу следующую ошибку:

Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin

с помощью этого кода:

var http = new getXMLHttpRequestObject();
var url = "http://gdata.youtube.com/action/GetUploadToken";
var sendXML = '<?xml version="1.0"?><entry xmlns="http://www.w3.org/2005/Atom"'+
    'xmlns:media="http://search.yahoo.com/mrss/'+
    'xmlns:yt="http://gdata.youtube.com/schemas/2007">'+
    '<media:group><media:title type="plain">My First API</media:title>'+
    '<media:description type="plain">First API</media:description>'+
    '<media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">People</media:category>'+
    '<media:keywords>first, api</media:keywords></media:group></entry>';
http.open("POST", url, true);
http.setRequestHeader("Authorization", "AuthSub token=" + AccessToken);
http.setRequestHeader("X-GData-Key", "key="+ dev_key);
http.setRequestHeader("Content-Type", "application/atom+xml; charset=UTF-8");

http.onreadystatechange = function() {
    if(http.readyState == 4) {
        alert(http.responseXML);
    }
}
http.send(sendXML);

Что может вызвать это и как его решить?

Ответ 1

Javascript ограничен при выполнении запросов ajax за пределами текущего домена.

  • Пример 1: ваш домен example.com и вы хотите сделать запрос на test.com = > вы не можете.
  • Пример 2: ваш домен example.com и вы хотите сделать запрос на inner.example.com = > вы не можете.
  • Пример 3: ваш домен example.com:80, и вы хотите сделать запрос example.com:81 = > , вы не можете
  • EX 4: ваш домен example.com и вы хотите сделать запрос example.com = > вы можете.

Javascript ограничивается "той же политикой происхождения" по соображениям безопасности, чтобы вредоносный script не мог связаться с удаленным сервером и отправлять конфиденциальные данные.

jsonp - это другой способ использования javascript. Вы делаете запрос, и результаты инкапсулируются в функцию обратного вызова, которая запускается на клиенте. Это то же самое, что связывать новый тег script в головной части вашего html (вы знаете, что вы можете загружать скрипты из разных доменов, кроме ваших здесь).
Однако для использования jsonp сервер должен быть настроен правильно. Если это не так, вы не можете использовать jsonp, и вы ДОЛЖНЫ полагаться на прокси-сервер на стороне сервера (PHP, ASP и т.д.). Есть много руководств, связанных с этой темой, просто google it!

Ответ 2

XMLHttpRequest не позволит вам достичь localhost:8080 из-за "той же политики происхождения".

Вы можете разрешать запросы из современных браузеров, добавляя заголовок к вашему ответу на localhost:8080:

Access-Control-Allow-Origin: *

Вы можете сделать это, добавив директивы на свой HTTP-сервер или добавив заголовки через серверный код (PHP, Ruby,...).

Подробнее о запросах ajax для Cross-Origin на https://developer.mozilla.org/en/http_access_control

Ответ 3

Если вы используете Chrome, простым решением (только для целей разработки) является использование опции --disable-web-security.

Ответ 4

Добавьте решение global.asax в ваше решение.

Добавить

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

в

protected void Application_BeginRequest(object sender, EventArgs e)
{
}

Ответ 5

Если вы используете apache, это работает: поместите это в/создайте файл .htaccess в свой общедоступный root и добавьте любые другие расширения файлов, которые могут вам понадобиться.

<FilesMatch "\.(ttf|otf|eot|woff|jpg|png|jpeg|gif|js|json|html|css)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>

Ответ 6

Для локальной разработки вы можете использовать инструмент для изменения заголовков ответов HTTP. Например Charles может сделать это с помощью включенного инструмента перезаписи: Rewrite Tool

Просто добавьте новое правило для целевого домена/местоположения:

Type: Add Header
Where: Response
Replace
     Name: Access-Control-Allow-Origin
     Value: *
Replace All

Ответ 7

Здесь нам нужно сделать две вещи для Apache Http

1) В файле httpd.config раскомментируйте этот файл

LoadModule headers_module modules/mod_headers.so

2) Добавьте эту строку внизу.

Header set Access-Control-Allow-Origin "*"

Ответ 8

Если вы используете Google Chrome в качестве браузера, вы можете добавить расширение CORS и активировать его, он решит проблему с отверстием, не изменив ничего в вашем коде.

Ответ 9

Несвязанный с этим конкретным вопросом, но для любого в этой ситуации с использованием jQuery... Эта ошибка также возникает, если вы пытаетесь сделать запрос JSONP с использованием jQuery и опустить параметр обратного вызова: callback=?

Ответ 10

Если вы из фона java, одним из возможных решений может быть создание сервлета, который вызывает веб-службы для вашего javascript. что-то вроде приведенного ниже кода в методе GET (ваш выбор)...

JsonElement jelement;
    JsonArray jarray;
    try {
        URL url = new URL("http://rest."YOUR URL"#ba0482");
        URLConnection connection = url.openConnection();
        connection.setDoInput(true);
        InputStream inStream = connection.getInputStream();
        BufferedReader input = new BufferedReader(new InputStreamReader(inStream));

        jelement = new JsonParser().parse(input);

        jarray = jelement.getAsJsonArray();

        response.setContentType("application/json");
        PrintWriter out = response.getWriter();
        out.print(jarray);
        out.flush();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Теперь в javascript просто укажите url как имя сервлета!!

Ответ 11

Я сталкиваюсь с тем же сообщением об ошибке при использовании ajax для доступа к php-странице (javascript и php файлы находятся на одном сервере).

Причина в том, что я указал IP-адрес как домен в своем JavaScript. Это заставило браузер полагать, что вызов php файла находится на другом сервере.

Так простое решение избавиться от этого сообщения об ошибке. a) проверить, что javascript и php файлы находятся на одном сервере b) убедитесь, что URL-адрес (в частности, домен) в вашем JavaScript (например, http://www.smartana.co.uk/myJavaScript.js) ajax отражает ваш URL-адрес сервера (например, http://www.smartana.co.uk/myServer.php).