В доступе отказано. Ошибка JavaScript при запросе к защищенной странице - PullRequest
1 голос
/ 03 февраля 2011

На странице SomePage.aspx, по коду JavaScript (XMLHttpRequest) я звоню SecuredPage.aspx Используется следующий код:

    var httpRequest = GetXmlHttp();
    var url = "https://myhost.com/SecuredPage.aspx";

    var params = "param1=" + document.getElementById('param1').value +
                "&param2=" + document.getElementById('param2').value;

    httpRequest.open("POST", url, true);
    httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

    httpRequest.onreadystatechange = function() {
        //Call a function when the state changes.
        if (httpRequest.readyState == 4 && httpRequest.status == 200) {
            alert(httpRequest.responseText);
        }
    }
    httpRequest.send(params); // HERE ACCESS IS DENIED.

    //---------------------------------------------
    function GetXmlHttp() {
        var xmlhttp = false;
        if (window.XMLHttpRequest) {
            xmlhttp = new XMLHttpRequest();
        }
        else if (window.ActiveXObject)
        // Code for Internet Explorer.
        {
            try {
                xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch (e) {
                try {
                    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (E) {
                    xmlhttp = false;
                }
            }
        }
        return xmlhttp;
    }

Выдает Доступ запрещен Ошибка. Если отправить на http (http://myhost.com/SecuredPage.aspx),, он работает нормально.

Как можно решить эту проблему?

Ответы [ 3 ]

5 голосов
/ 03 февраля 2011

Если вы хотите получить страницу HTTPS через Ajax, вам нужно сделать это со страницы HTTPS в том же домене, иного пути нет, если вы используете Ajax. Это из-за той же политики происхождения .

Тем не менее, существует множество способов сделать это, не используя Ajax, например, вы можете использовать фреймы .

Другой способ - использовать JSONP , но для этого необходимо, чтобы вы извлекали, ну, в общем, JSON:)

Третий способ, который, как правило, не очень полезен для производственных веб-сайтов, но с которым все же может быть интересно повозиться, заключается в использовании YQL в качестве прокси.

Наконец, вы всегда можете настроить свой собственный прокси-сервер, чтобы вызывать HTTP-адрес, который выбирает страницу HTTPS и отправляет ее дальше, но это редко является хорошим решением, если его можно избежать.

2 голосов
/ 03 февраля 2011

Это связано с тем, что браузер рассматривает http и https как 2 разных сайта / домена, и поэтому вы должны придерживаться одной и той же политики происхождения.

Due to browser security restrictions, most "Ajax" requests are subject to the same origin policy; the request can not successfully retrieve data from a different domain, subdomain, or protocol.

Один из способов решить эту проблему - использовать jsonp.

1 голос
/ 03 февраля 2011

Как уже было сказано, ваша проблема в том, что ваш браузер воспринимает это как междоменный запрос. Еще один способ решить эту проблему - настроить файл crossdomain.xml следующим образом:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <allow-access-from domain="myhost.com" />
  <allow-access-from domain="ourhost.com" />
  <site-control permitted-cross-domain-policies="master-only" />
</cross-domain-policy>

Я не эксперт по этому методу, но я успешно использовал его. Другие домены можно добавить, добавив больше тегов allow-access-from. Возможно, вам придется поиграть. YMMV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...