XMLHttpRequest: Access denied
Всем привет!
Я создал в Майкрософт Визуал Студио App for Office MissingPartEvaluation проект. Этот проект состоит из двух проектов 1. MissingPartEvaluation и 2.MissingPartEvaluationWeb. Содержание второго проекта я копирую на IIS-Сервер. В первом проекте есть манифест-файл, в котором я поставил Код:
<SourceLocation DefaultValue .../> Во втором проекте MissingPartEvaluationWeb мне нужен доступ к базой данных, которая в свою очередь находится на другом сервере. Чтобы соединиться с сервером с базой данных, я посылаю реквест следующим образом. var url = "https://wosevvt227/ajaxReq/php/getData.php"; var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'json'; //xhr.setRequestHeader("Authorization", "Basic ***********=="); xhr.setRequestHeader("Access-Control-Allow-Origin", "*"); xhr.withCredentials = true; xhr.onload = function () { var status = xhr.status; console.log("Status: " + status); if (status === 200) { console.log("All ok"); } else { console.log("Houston, we have a problem"); } var response = xhr.responseText; console.log("Response: " + response); }; xhr.send(); К сожалению, выполнение этого кода ведёт к следующей ошибки: SCRIPT7002: XMLHttpRequest: Network error 0x80070005, Access denied MissingPartSummary.html У кого-нибудь есть идеи, как можно решить эту проблему? |
Цитата:
|
Если убрать строчку
xhr.setRequestHeader("Access-Control-Allow-Origin", "*"); тогда дополнительно к уже существующей появляется ошибка SEC7120: The origin https://evdata-t was not found in Access-Control-Allow-Origin-Header. MissingPartSummary.html Как это делается на сервере, в файле Web.config? |
Access-Control-Allow-Origin - этот заголовок разрешает доступ к содержимому запрошенного сервера, то есть сервер дает на это разрешение. В противном случае браузер заблокирует к нему доступ.
Вы пишите, что обращаетесь к другому серверу на котором БД, значит он и должен этим заголовком давать такое разрешение. Или ситуация иная? PS. Вне браузера этот заголовок не имеет смысла. |
Цитата:
Если "Access-Control-Allow-Origin", "*" - это главный источник проблемы, тогда мне было бы интересно узнать, как его включить на IIS - сервере. |
Цитата:
header("Access-Control-Allow-Origin: *"); //а еще лучше указать конкретный домен, если не публичный доступ |
codeamateur,
у вас же посредник доступа к базе, а значит для клиента заголовок должен передавать посредник, отвечать то ему. |
Решение главной проблемы
Большое спасибо, laimas Мне это помогло. Я написал новый php - скрипт getDataAllowOrigin.php, который выглядит вот так.
<?php include("./db_connect.php"); header('Access-Control-Allow-Origin: https://evdata-t'); header('Access-Control-Allow-Credentials: true'); $db = DB_logon(); $arr = array(); //--- Resulting Array $sql = " SELECT TOP 10 [COLUMN_1] ,[COLUMN_2] ,[COLUMN_3] ,[COLUMN_4] ,[COLUMN_5] ,[COLUMN_6] FROM [MVK]"; $stmt = sqlsrv_query( $db, $sql ); //if (sqlsrv_num_rows( $stmt ) > 0) { $counter = 0; while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) { $arr[] = array( 'COLUMN_1' => htmlentities($row['COLUMN_1']) ,'COLUMN_2' => $row['COLUMN_2'] ,'COLUMN_3' => $row['COLUMN_3'] ,'COLUMN_4' => $row['COLUMN_4'] ,'COLUMN_5' => $row['COLUMN_5'] ,'COLUMN_6' => $row['COLUMN_6'] ); } sqlsrv_free_stmt( $stmt); sqlsrv_close($db); //} echo json_encode($arr); ?> Я поправил первую строку скрипта и получается. var url = "https://wosevvt227/ajaxReq/php/getDataAllowOrigin.php"; var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'json'; xhr.withCredentials = true; xhr.onload = function () { var status = xhr.status; console.log("Status: " + status); if (status === 200) { console.log("All ok"); } else { console.log("Houston, we have a problem"); } var response = xhr.responseText; console.log("Response: " + response); }; xhr.send(); Теперь я продвинулся на шаг дальше и верхней ошибки больше нет. Вот что видно на JavaScript-Konsole: Status: 200 All ok Response: <br /> <b>Warning</b>: sqlsrv_query() expects parameter 1 to be resource, null given in <b>C:\inetpub\wwwroot\bb\ajaxReq\php\getDataAllowO rigin.php</b> on line <b>17</b><br /> <br /> <b>Warning</b>: sqlsrv_fetch_array() expects parameter 1 to be resource, boolean given in <b>C:\inetpub\wwwroot\bb\ajaxReq\php\getDataAllowO rigin.php</b> on line <b>21</b><br /> <br /> <b>Warning</b>: sqlsrv_free_stmt() expects parameter 1 to be resource, boolean given in <b>C:\inetpub\wwwroot\bb\ajaxReq\php\getDataAllowO rigin.php</b> on line <b>30</b><br /> <br /> <b>Warning</b>: sqlsrv_close() expects parameter 1 to be resource, null given in <b>C:\inetpub\wwwroot\bb\ajaxReq\php\getDataAllowO rigin.php</b> on line <b>31</b><br /> [] |
Первая ошибка гласит о том, что первый параметр требует ресурса ($db, это не объект, ищите ошибки в DB_logon()). А все остальные, это следствие первой ошибки.
|
Спасибо. Мне удалось решить эту проблему. Теперь я получаю json - Object.
|
Часовой пояс GMT +3, время: 17:02. |