Почему я вижу ошибку «происхождение не разрешено Access-Control-Allow-Origin» здесь? [Дубликат]

149

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

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
    Вы уверены, что используемая вами точка входа на YouTube активирована jsonp? Вы не можете сделать ajax-вызов во внешний домен, если не используете прокси на стороне сервера или конечный компонент jsonp.
Теги:
xmlhttprequest
cors
youtube-api

11 ответов

169
Лучший ответ

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
    Спасибо! Я не знал, что это произойдет на том же хосте, но в другом порту.
  • 0
    Могу ли я использовать AmplifyJS для отправки на другой домен?
Показать ещё 3 комментария
88

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

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

Access-Control-Allow-Origin: *

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

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

  • 15
    Если я правильно понимаю, то сервер API или удаленный ресурс (в данном случае сервер YouTube) должен установить заголовок, т. Е. Это должен быть хост API, а не вызывающий API.
  • 1
    @ 0x4a6f4672 Правильно!
Показать ещё 10 комментариев
38

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

  • 52
    Что вы , конечно , только хотите, чтобы сделать для целей развития, никогда при серфинге
  • 0
    Договорились @kynan и обновили мой ответ.
Показать ещё 2 комментария
10

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

Добавить

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

в

protected void Application_BeginRequest(object sender, EventArgs e)
{
}
  • 0
    Почему люди понизили это? Это способ добиться этого в ASP.net
  • 0
    Я попробовал это, но не сработало. все еще получаю ошибку. используя MVC5
Показать ещё 1 комментарий
9

Если вы используете 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>
7

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

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

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

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

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

LoadModule headers_module modules/mod_headers.so

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

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

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

2

Если вы из фона 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 как имя сервлета!!

2

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

  • 1
    Магический параметр может иметь и другие имена. Документация: api.jquery.com/jQuery.getJSON/#jsonp
0

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню