Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.07.2018, 17:32
Интересующийся
Отправить личное сообщение для codeamateur Посмотреть профиль Найти все сообщения от codeamateur
 
Регистрация: 17.07.2018
Сообщений: 13

XMLHttpRequest: Access denied
Всем привет!

Я создал в Майкрософт Визуал Студио App for Office MissingPartEvaluation проект. Этот проект состоит из двух проектов 1. MissingPartEvaluation и 2.MissingPartEvaluationWeb.

Содержание второго проекта я копирую на IIS-Сервер. В первом проекте есть манифест-файл, в котором я поставил

Код:
<SourceLocation DefaultValue .../>
таким образом, чтобы во время исполнения программа посылала запрос на IIS-Сервер.

Во втором проекте 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


У кого-нибудь есть идеи, как можно решить эту проблему?
Ответить с цитированием
  #2 (permalink)  
Старый 17.07.2018, 18:02
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от codeamateur
"Access-Control-Allow-Origin", "*"
Этот заголовок должен передавать не клиент, а сервер - https://wosevvt227/
Ответить с цитированием
  #3 (permalink)  
Старый 17.07.2018, 18:11
Интересующийся
Отправить личное сообщение для codeamateur Посмотреть профиль Найти все сообщения от codeamateur
 
Регистрация: 17.07.2018
Сообщений: 13

Если убрать строчку

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?
Ответить с цитированием
  #4 (permalink)  
Старый 17.07.2018, 18:21
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Access-Control-Allow-Origin - этот заголовок разрешает доступ к содержимому запрошенного сервера, то есть сервер дает на это разрешение. В противном случае браузер заблокирует к нему доступ.

Вы пишите, что обращаетесь к другому серверу на котором БД, значит он и должен этим заголовком давать такое разрешение.

Или ситуация иная?

PS. Вне браузера этот заголовок не имеет смысла.

Последний раз редактировалось laimas, 17.07.2018 в 18:33.
Ответить с цитированием
  #5 (permalink)  
Старый 17.07.2018, 18:33
Интересующийся
Отправить личное сообщение для codeamateur Посмотреть профиль Найти все сообщения от codeamateur
 
Регистрация: 17.07.2018
Сообщений: 13

Сообщение от laimas Посмотреть сообщение
Access-Control-Allow-Origin - этот заголовок разрешает доступ к содержимому запрошенного сервера, то есть сервер дает на это разрешение. В противном случае браузер заблокирует к нему доступ.

Вы пишите, что обращаетесь к другому серверу на котором БД, значит он и должен этим заголовком давать такое разрешение.

Или ситуация иная?
Да я хочу обратится к БД = Базой данных на другом сервере. Но у него нет URL, которым я мог бы воспользоваться для применения XMLHttpRequest. ActiveХObject тоже не получается. Это вы видели в другой теме. Поэтому я посылаю реквест на IIS - сервер https://wosevvt227, на котором есть php - скрипт getData.php. Этот скрипт имеет функцию, которая мне должна дать данные в json-формате.

Если "Access-Control-Allow-Origin", "*" - это главный источник проблемы, тогда мне было бы интересно узнать, как его включить на IIS - сервере.
Ответить с цитированием
  #6 (permalink)  
Старый 17.07.2018, 18:41
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от codeamateur
тогда мне было бы интересно узнать, как его включить на IIS - сервере.
Просто передавайте их в РНР файле, который отвечает на запрос клиента:

header("Access-Control-Allow-Origin: *"); //а еще лучше указать конкретный домен, если не публичный доступ
Ответить с цитированием
  #7 (permalink)  
Старый 17.07.2018, 19:08
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

codeamateur,
у вас же посредник доступа к базе, а значит для клиента заголовок должен передавать посредник, отвечать то ему.
Ответить с цитированием
  #8 (permalink)  
Старый 17.07.2018, 19:26
Интересующийся
Отправить личное сообщение для codeamateur Посмотреть профиль Найти все сообщения от codeamateur
 
Регистрация: 17.07.2018
Сообщений: 13

Решение главной проблемы
Большое спасибо, 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 />
[]
Ответить с цитированием
  #9 (permalink)  
Старый 17.07.2018, 19:31
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Первая ошибка гласит о том, что первый параметр требует ресурса ($db, это не объект, ищите ошибки в DB_logon()). А все остальные, это следствие первой ошибки.
Ответить с цитированием
  #10 (permalink)  
Старый 20.07.2018, 19:17
Интересующийся
Отправить личное сообщение для codeamateur Посмотреть профиль Найти все сообщения от codeamateur
 
Регистрация: 17.07.2018
Сообщений: 13

Спасибо. Мне удалось решить эту проблему. Теперь я получаю json - Object.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Invalid calling object + Access denied Вы не робот? Events/DOM/Window 4 28.12.2016 09:40
XMLHttpRequest передача массива серверу JaneLane AJAX и COMET 5 16.05.2014 12:09
permission denied to access property 'href' -Lesnik- Firefox/Mozilla 0 28.10.2013 17:45
помогите со скриптом jquery hesrun jQuery 24 22.02.2013 12:59
Access is denied при работе с iFrame slivka_83 Общие вопросы Javascript 1 30.09.2009 10:05