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 ответа:
во время предполетного запроса вы должны увидеть следующие два заголовка: 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;
так как предполетный режим не требуется.