2016-02-13 3 views
-1

Я очень смущен этим. Когда я начал заниматься веб-разработкой несколько лет назад, я помню, как я работал в SOP, блокируя мои запросы.Когда применяется политика одинакового происхождения?

Но где-то по пути с тех пор я забыл об этом и не сталкивался с ним годами. Я знаю, что он все еще существует, и все же я могу сделать $.ajax или любой другой такой вариант без провала запроса. Страницы моей компании делают десятки запросов на сторонние службы через несколько фреймворков без проблем.

В чем дело? Разве только современные веб-фреймворки и библиотеки знают, как обойти это и позаботиться о нем для меня? Просто, может быть, с тех пор, как я не выписал XMLHttpRequest вручную в течение лет, я больше не сталкивался с этим? Есть ли какой-то вариант для XMLHttpRequest, например origin, который решает это или что-то еще?

+0

https: //developer.mozilla .org/en-US/docs/Web/Security/Same-origin_policy попробуйте посмотреть, что – Binvention

+0

SOP никогда не блокировал запросы.Он сделал (и делает) блокировать доступ к ответу. – Bergi

+0

Вы ищете [CORS] (https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) – Bergi

ответ

1

Основное правило

Same Origin Policy применяется на любой HTTP-вызова, сделанного из страницы в домене, отличном что домен веб-страницы (включая поддомен) другие, чем для GET вызова.

Это означает, что если вы добавите на страницу тег сценария, загрузите изображение или выполните любой HTTP-вызов, который использует метод GET, то у вас нет проблем. Если, с другой стороны, вы пытаетесь использовать другой метод, такой как POST, PUT, DELETE и т. Д., В другой домен, тогда браузер заблокирует вызов и выдаст ошибку.

Пути вокруг этого

Есть, однако, несколько способов, где вы можете обойти эту проблему.

Первый заключается в использовании вызова GET, но другая сторона интерпретирует вызов как нечто другое. Прекрасным примером этого является метод JSONP, в котором мы добавляем тег сценария на страницу (который является вызовом GET), а сервер, отвечающий на вызов GET, не возвращает только обычный JS-скрипт, а скорее он возвращает «однозначно настроенный» ответ, который ссылается на код на исходной странице, чтобы сообщить ему, что он имеет подходящий ответ.

Существует несколько шаблонов для достижения этой цели, наиболее распространенной является сборка в jQuery, где GET-вызов добавляет параметр запроса с именем функции, а возвращаемый скрипт вызывает эту функцию в глобальной области. jQuery прослушал этот вызов и ответил соответствующим образом. Чтобы узнать больше идти к этому ответу: Confused on how a JSONP request works

Непредсказуемого

Новый способ обойти эту проблему, которая является гораздо более чистым решением, чем JSONP то, что называется CORS, который является своим родом договора между браузером и веб-сервером. По сути, что делает браузер (при условии, что он поддерживает CORS, старые браузеры этого не делают), вместо того, чтобы полностью блокировать вызов «не GET», браузер сначала выполнит вызов OPTIONS на веб-сервере. Веб-сервер рассмотрит запрос и определит, какие «варианты» (методы AKA) для этого клиента имеют для связи с ним. По умолчанию используется только один вариант: вызов GET, но вы можете настроить свой веб-сервер для поддержки других параметров, таких как PUT, DELETE и т. Д. Чтобы узнать больше о CORS смотрите на https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

Смежные вопросы