Почему я вижу ошибку "origin не разрешен 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);

что может вызвать это, и как я могу это решить?

11 ответов


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

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

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

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


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

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

Access-Control-Allow-Origin: *

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

подробнее о кросс-доменных AJAX-запросы на https://developer.mozilla.org/en/http_access_control


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


добавить глобальный.asax в вашем решении.

добавить

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

на

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

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

<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>

для локальной разработки можно использовать инструмент для изменения заголовков ответов HTTP. Например Чарльз может сделать это с помощью включенного инструмента перезаписи:Инструмент Переписать

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

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

Если вы используете google chrome в качестве браузера, вы можете добавить расширение CORS и активировать его , это решит проблему отверстия без необходимости что-либо менять в коде


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

1) в httpd.файл конфигурации, раскомментируйте этот файл

LoadModule headers_module modules/mod_headers.so

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

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

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


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

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 в качестве имени сервлета!!


Я сталкиваюсь с тем же сообщением об ошибке при использовании 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).