Почему я вижу ошибку «Происхождение не допускается здесь по ошибке с контролем доступа? [дублировать
-
26-10-2019 - |
Вопрос
Этот вопрос уже имеет ответ здесь:
Я вижу следующую ошибку:
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);
Что может вызвать это, и как мне это решить?
Решение
JavaScript ограничен при выполнении запросов AJAX за пределами текущего домена.
- EX 1: Ваш домен - пример. Их хотите сделать запрос на тест.com => Вы не можете.
- Ex 2: Ваш домен - это пример. И вы хотите сделать запрос на inner.example.com => Вы не можете.
- Ex 3: Ваш домен - пример.
- Ex 4: Ваш домен - это пример. И вы хотите сделать запрос на 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
.
Добавьте Global.asax в свое решение.
Добавлять
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
в
protected void Application_BeginRequest(object sender, EventArgs e)
{
}
Если вы используете Apache, это работает: поместите это в/создайте файл .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
Здесь нам нужно сделать две вещи для Apache http
1) В файле httpd.config, расстроен этот файл
LoadModule headers_module modules/mod_headers.so
2) Добавьте эту линию внизу.
Header set Access-Control-Allow-Origin "*"
Если вы используете Google Chrome в качестве браузера, вы можете добавить расширение CORS и активировать его, он решит проблему отверстия, не изменяя что -либо в вашем коде.
Не связанный с этим конкретным вопросом, но для любого в этой ситуации, использующем jQuery ... Эта ошибка также вызвана, если вы попытаетесь сделать запрос JSONP, используя jQuery и опустите параметр Magic обратного вызова: callback=?
Если вы из фона 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 как имя сервлета !!
Я сталкиваюсь с одним и тем же сообщением об ошибке, при использовании 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).