CORS-как сделать "предполетный" httprequest?


Я пытаюсь сделать междоменный HTTP-запрос к службе WCF (которой я владею). Я прочитал несколько методов работы с ограничениями междоменных сценариев. Поскольку моя служба должна учитывать запросы GET и POST, я не могу реализовать какой-либо динамический тег сценария, src которого является URL-адресом запроса GET. Поскольку я могу вносить изменения на сервере, я начал пытаться реализовать обходной путь, который включает настройку ответов сервера для включения "Доступ-контроля-разрешить-происхождение заголовка" и предполетной запросы и запросу варианты. Я получил идею из этого поста : получение CORS работает

на стороне сервера мой веб-метод добавляет "Access-Control-Allow-Origin: *" к ответу HTTP. Я вижу, что ответы действительно включают этот заголовок сейчас. Мой вопрос: как мне "предварительно выполнить" запрос (параметры)? Я использую jQuery.getJSON, чтобы сделать запрос GET, но браузер отменяет запрос сразу с помощью печально известный:

происхождения http://localhost не допускается Access-Control-Allow-Origin

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

спасибо!

2 84

2 ответа:

во время предполетного запроса вы должны увидеть следующие два заголовка: Access-Control-Request-Method и Access-Control-Request-Headers. Эти заголовки запросов запрашивают у сервера разрешения на выполнение фактического запроса. Ваш предполетный ответ должен подтвердить эти заголовки, чтобы фактический запрос работал.

например, предположим, что браузер делает запрос со следующими заголовками:

Origin: http://yourdomain.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-Custom-Header

ваш сервер должен ответить с помощью следующие заголовки:

Access-Control-Allow-Origin: http://yourdomain.com
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: X-Custom-Header

обратите особое внимание на заголовок ответа Access-Control-Allow-Headers. Значение этого заголовка должно совпадать с заголовком запроса Access-Control-Request-Headers, и оно не может быть '*'.

Как только вы отправите этот ответ на предварительный запрос, браузер сделает сам запрос. Вы можете узнать больше о CORS здесь:http://www.html5rocks.com/en/tutorials/cors/

хотя эта тема восходит к 2014 году, проблема все еще может быть актуальной для многих из нас. Вот как я справился с этим в контексте jQuery 1.12 /PHP 5.6:

  • jQuery отправил свой запрос XHR, используя только ограниченные заголовки; был отправлен только "Origin".
  • предварительный запрос не требовался.
  • сервер должен был только обнаружить такой запрос и добавить "Access-Control-Allow-Origin:" . $ _SERVER['HTTP_ORIGIN'] заголовок, после обнаружения, что это было кросс-доменный XHR-запрос.

пример PHP кода:

if (!empty($_SERVER['HTTP_ORIGIN'])) {
    // Uh oh, this XHR comes from outer space...
    // Use this opportunity to filter out referers that shouldn't be allowed to see this request
    if (!preg_match('@\.partner\.domain\.net$@'))
        die("End of the road if you're not my business partner.");

    // otherwise oblige
    header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']);
}
else {
    // local request, no need to send a specific header for CORS
}

в частности, не добавить exit; так как предполетный режим не требуется.