Заголовки ответа на междоменный запрос jQuery

Я делаю междоменные ajax-запросы с типом данных html. Они работают нормально, когда я включаю

Access-Control-Allow-Origin

в ответе от сервера. Проблема в том, что мне нужно получить определенные заголовки из ответа сервера, и что бы я ни делал, заголовки ответа, кроме «типа контента», возвращают значение null.

jQuery выполняет запрос, получает ответ, включая заголовки (я вижу это по трафику), но не анализирует его.

я пытался использовать

crossDomain: true

Это не помогло. Вот пример ответа от сервера.

Access-Control-Allow-Origin:*
Cache-Control:private
Content-Encoding:gzip
Content-Length:514
Content-Type:text/html; charset=utf-8 
X-MYRESPONSEHEADER:1

Если запрашивающий и отвечающий документ находятся на одном сервере

 success: function (data, status, xhr) {
        totalRows = xhr.getResponseHeader("X-MYRESPONSEHEADER");

работает отлично. Я также пытался присвоить $.ajax переменной, например

var jQxhr = $.ajax(.....

Я не понимаю, почему он не будет проанализирован, поскольку jQuery фактически делает запрос и получает ответ.

Есть идеи? Я что-то пропустил?

Обновление или комментарий дракона

Заголовки отправлены на запрос

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-MYRESPONSEHEADER
Access-Control-Allow-Methods: POST
Access-Control-Allow-Methods: GET
X-MYRESPONSEHEADER: 24
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 29 Feb 2012 11:34:21 GMT

Длина содержимого: 514


person nLL    schedule 28.02.2012    source источник


Ответы (4)


Вам нужно добавить еще один заголовок, специфичный для CORS, в ответ сервера, Access-Control-Allow-Headers. В этом случае,

Access-Control-Allow-Headers: X-MYRESPONSEHEADER

Ссылка: https://developer.mozilla.org/en/http_access_control#Access-Control-Allow-Headers

person dragon    schedule 28.02.2012
comment
это не сработало для меня. как вы думаете, мне нужно присвоить $.ajax переменной? - person nLL; 28.02.2012
comment
Ваш запрос HTTP OPTIONS возвращает соответствующие заголовки контроля доступа? - person dragon; 29.02.2012
comment
@nLL Не могли бы вы добавить полные заголовки запроса/ответа для каждого из двух сделанных запросов? Первый запрос — OPTIONS, а второй — GET/POST. - person dragon; 01.03.2012
comment
Я не делаю никаких запросов OPTIONS вручную и не вижу, чтобы jQuery делал это. Это часть процесса? Если да, то как jQuery узнает об этом? - person nLL; 01.03.2012
comment
Это часть процесса, и в некоторых случаях браузеры делают это перед выполнением междоменных вызовов в соответствии со спецификациями. Обратите внимание, что jQuery не выполняет этот вызов — это делают браузеры. Чтобы узнать больше, developer.mozilla.org/en/ - person dragon; 02.03.2012
comment
Я тестирую его в Chrome и не вижу никаких запросов от браузера. В любом случае придется копнуть глубже. Спасибо за ваше время - person nLL; 02.03.2012
comment
Access-Control-Allow-Headers контролирует только то, какие заголовки запросов могут быть отправлены. Это не влияет на заголовки ответов. - person Tal Lev-Ami; 28.02.2013

Если вы используете aws s3 (и я предполагаю, что это применимо в противном случае), проблема, возможно, заключается в отсутствующем теге конфигурации CORS. Я столкнулся с аналогичной проблемой с пропажей. Вот моя завершенная конфигурация:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>http://localhost:3000</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
        <ExposeHeader>*</ExposeHeader>
    </CORSRule>
</CORSConfiguration>

AllowedHeader устанавливает заголовок Access-Control-Request-Headers, а ExposeHeader устанавливает заголовок Access-Control-Expose-Headers, без которого браузер не позволит javascript использовать возвращаемые заголовки. .

person Steven Soroka    schedule 24.10.2012
comment
S3 выдает ошибку: ExposeHeader * содержит подстановочный знак. В настоящее время мы не поддерживаем подстановочные знаки для ExposeHeader. - person Dane W; 30.01.2013
comment
Та же проблема - не работает с подстановочным знаком. В моем случае, хотя мне просто нужно, чтобы браузер отображал заголовок Location, и этот ответ работал с явно определенным заголовком. - person Ben Alavi; 16.05.2015

Чтобы прочитать в ответе сервера заголовки, отличные от типа содержимого, сервер должен указать Access-Control-Expose-Headers, например:

Access-Control-Expose-Headers: X-MYRESPONSEHEADER 

В ответе @dragon упоминается Access-Control-Allow-Headers, который контролирует только то, какие заголовки клиент может отправлять при отправке запроса на сервер.

Полезное руководство по CORS здесь: http://www.html5rocks.com/en/tutorials/cors/< /а>

person tekumara    schedule 15.03.2016

Вот конфигурация, которая работала для меня. Я поместил его в метод фильтра java Filter. Некоторые заголовки нужно отправлять только с предварительным запросом (метод = "OPTIONS"), нет необходимости отправлять их каждый раз.

Обратите внимание, что для заголовка «Авторизация» также требуется «Access-Control-Allow-Credentials».

 HttpServletResponse resp = (HttpServletResponse) res;
 resp.addHeader("Access-Control-Allow-Origin", "http://your_domain:your_port");
 resp.addHeader("Access-Control-Allow-Credentials", "true");
 if (((HttpServletRequest) req).getMethod().equals("OPTIONS")) {
       resp.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
      resp.addHeader("Access-Control-Allow-Headers", "Authorization");
      return;
  }
person vinga    schedule 04.09.2016