Заголовки ответа на междоменный запрос jQuery - PullRequest
6 голосов
/ 28 февраля 2012

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

Access-Control-Allow-Origin

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

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

Ответы [ 4 ]

2 голосов
/ 24 октября 2012

Если вы используете 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 использовать возвращаемые заголовки.

2 голосов
/ 15 марта 2016

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

Access-Control-Expose-Headers: X-MYRESPONSEHEADER 

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

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

2 голосов
/ 28 февраля 2012

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

Access-Control-Allow-Headers: X-MYRESPONSEHEADER

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

0 голосов
/ 04 сентября 2016

Вот конфигурация, которая работала для меня. Я положил его в метод фильтра Java фильтра. Некоторые заголовки нужно отправлять только с предварительным запросом (method = "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;
  }
...