Есть ли «безопасный» способ проверить, применяется ли одна и та же политика происхождения к URL-адресу до фактического использования методов ajax? Вот что у меня есть:
function testSameOrigin(url) {
var loc = window.location,
a = document.createElement('a');
a.href = url;
return a.hostname == loc.hostname &&
a.port == loc.port &&
a.protocol == loc.protocol;
}
Это безопасный и надежный способ сделать это, при условии, что вы делаете (или, вернее, не делать) некоторые вещи.
Этот вид работ, но это своего рода руководство, основанное на статье в википедии.
Это должно полностью работать в соответствии с «нормальными» обстоятельствами. Его нужно будет изменить, если вы планируете использовать cross-domain scripting.
Если вы изменяете document.domain
в своих сценариях, например, с примера "foo.example.com" и "bar.example.com".ком»ваша testSameOrigin
функция будет возвращать false
для„http://example.com“, где на самом деле он должен вернуть true
.
Если вы планируете изменения document.domain
, вы можете просто добавить добавить проверку, что в сценарии.
Если вы планируете использовать CORS (см. Ссылку выше), чтобы разрешить междоменную связь, она также вернет ложный отрицательный результат. Но если вы используете CORS, у вас будет список доменов, с которыми вы можете общаться, и вы может также добавить этот список к этой функции.
Есть ли лучший способ предварительной проверки надбавки за кросс-домен? jQuery подходит для использования.
Вероятно, нет, хотя это может быть стоит упомянуть то, что вы видите в консоли от ответа Стива может быть «дилемма наблюдателя» ... Эти ошибки выглядят как они в результате консоли пытаются осмотрят другое окно, не обязательно из сценария.
Предполагая, что вы не возитесь с document.domain
или используете CORS, ваше исходное решение, вероятно, лучше, так как не нужно делать дополнительный запрос, чтобы определить, доступен ли сервер или нет. Даже если вы делаете некоторые междоменные скрипты, изменение функции, которую вы теперь можете разместить, вероятно, будет вашим лучшим выбором.
Если вы выполняете кросс-доменный запрос, он сработает с 'readystate = 4' и' statuscode = 0', что аналогично прерванному запросу. Так как вам все равно нужно защищать от прерванных запросов, зачем вам нужна эта проверка? Я чувствую, что эта мера безопасности применяется снаружи, вы не контролируете ее, поэтому любая проверка изнутри среды по определению неверна. Поэтому я не думаю, что вы должны когда-либо проверять это, просто пропустите запрос. – Halcyon