Совместное использование ресурсов с PrototypeJS - PullRequest
5 голосов
/ 05 августа 2010

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

Content-Type должен быть включен в application / x-www-form-urlencoded, multipart / form-data или text / plain, простой запрос не устанавливает настраиваемые заголовки с помощью http-запроса, и Сервер должен установить правильный заголовок Access-Control-Allow-Origin.

с ванильным JavaScript XMLHttpRequest все работает нормально, но с PrototypeJS он не будет работать, потому что он показывает, что Prototype устанавливает несколько пользовательских заголовков, и я не знаю, как это предотвратить.

Я попробовал это в Prototype через:

new Ajax.Request('some.foreign-host.com/res.php', {
  method: 'post',
  postBody: 'foo=bar', 
  contentType: 'application/x-www-form-urlencoded', 
  onSuccess: function(e){
    // some custom code
  }
});

Есть идеи, как заставить Prototype отправлять такой простой запрос CORS?


У меня есть дамп заголовков, созданных простым JavaScript XMLHttpRequest :

POST /bthesis/returnJSON.php HTTP/1.1    
Host: foreign-host.com                         
Connection: keep-alive                   
Referer: this-host.com
Content-Length: 9                        
Origin: this-host.com     
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept: */*                              
User-Agent: [...]
Accept-Encoding: gzip,deflate,sdch       
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

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

OPTIONS /bthesis/returnJSON.php HTTP/1.1 
Host: foreign-host.com                        
Connection: keep-alive                   
Referer: this-host.com
Access-Control-Request-Method: POST      
Origin: this-host.com      
Access-Control-Request-Headers: X-Prototype-Version, X-Requested-With, Content-type, Accept
Accept: */*                              
User-Agent: [...]
Accept-Encoding: gzip,deflate,sdch       
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

Prototype использует совершенно другой набор заголовков ... что приводит к следующей ошибке в консоли:

XMLHttpRequest не может загрузить foreign-host.com/bthesis/returnJSON.php. Поле заголовка запроса X-Prototype-Version не разрешено Access-Control-Allow-Headers. Отказался от получения небезопасного заголовка "X-JSON"

Странно то, что веб-сервер в обоих случаях возвращает запрошенный ресурс (я вижу его в представлении «Ресурсы» консоли разработчика в chrome), но он показывает, что прототип не имеет к нему доступа каким-либо образом

Ответы [ 4 ]

11 голосов
/ 15 февраля 2013

У меня такая же проблема. Ссылка @mplungjan поделился содержит ответ:

Вы просто должны сообщить браузеру, что заголовок x-json безопасен, используя access-control-expose-headers

Я использую эту строку в контроллере Ruby on Rails

  headers['Access-Control-Expose-Headers'] = 'x-json'

(Это должно быть довольно легко перевести на другие языки программирования :))

Подробнее на этой странице

1 голос
/ 21 марта 2013

Я нашел решение по другому вопросу SO . И это работает для меня - подробности здесь .

Подводя итог - вам нужно onCreate событие в вашем Ajax.Request, которое удаляет нестандартные заголовки:

    onCreate: function(response) { // here comes the fix
        var t = response.transport; 
        t.setRequestHeader = t.setRequestHeader.wrap(function(original, k, v) { 
            if (/^(accept|accept-language|content-language)$/i.test(k)) 
                return original(k, v); 
            if (/^content-type$/i.test(k) && 
                /^(application\/x-www-form-urlencoded|multipart\/form-data|text\/plain)(;.+)?$/i.test(v)) 
                return original(k, v); 
            return; 
        }); 
    }
1 голос
/ 29 октября 2010

Пожалуйста, посмотрите на PREFLIGHT здесь https://developer.mozilla.org/En/HTTP_access_control

Ваша проблема в том, что Fx реагирует на пользовательские заголовки (X -...) и запускает предварительную проверку. Вам понадобится, чтобы сервер возвратил все заголовки контроля доступа для OPTIONS и POST и разрешил настраиваемые заголовки.

0 голосов
/ 05 августа 2010

Может быть, вы можете установить исходный заголовок самостоятельно в Ajax-запросе, например так:

new Ajax.Request('some.foreign-host.com/res.php', {
    method: 'post',
    postBody: 'foo=bar',
    requestHeaders: {Origin: 'http://www.my.local-host.com'}
    contentType: 'application/x-www-form-urlencoded', 
    onSuccess: function(e){
        // some custom code
    }
});

Хотя сам никогда не пробовал ... Что происходит с версией Prototype?Выполняется ли запрос, а затем ничего не возвращается, или ответ отклоняется, или что?

...