2010-08-05 5 views
5

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

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 
    } 
}); 

Любая идея, как получить прототип, чтобы послать такой простой 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 

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

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 

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

XMLHttpRequest не может загрузить foreign-host.com/bthesis/returnJSON.php. Поле заголовка запроса X-Prototype-Version недопустимо с помощью Access-Control-Allow-Headers. Отказано, чтобы получить небезопасный заголовок «X-JSON»

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

ответ

0

может быть, вы можете установить происхождение заголовка самостоятельно в запросе 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 
    } 
}); 

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

1

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

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

11

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

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

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

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

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

Более подробно об этом page

+1

Это работало для меня. спасибо – FosAvance

1

Я нашел решение на other SO question. И это работает для меня - details are here.

Подводя итог - вам нужно 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; 
     }); 
    } 
Смежные вопросы