2012-04-25 2 views
1

У меня есть веб-сервис, который работает более GET. Чтобы получить доступ к этой веб-службе, необходимо передать некоторые пользовательские заголовки.Как обслуживать предполетный запрос с веб-службы

Когда я пытаюсь получить доступ к веб-службе с кодом javascript с помощью метода GET, метод запроса изменяется на OPTIONS. (домен отличается)

Я прочитал несколько статей, чтобы узнать, что запрос с пользовательскими заголовками будет предварительно отправлен, и в этом случае перед вызовом фактического метода на сервер будет отправлен запрос с помощью метода OPTIONS.

Но моя проблема после вызова OPTIONS, реальный метод (т. Е. GET) не вызывается.

OPTIONS вызов возвращается статус, как 401.

Я сомневаюсь, что это потому, что мой веб-сервис поддерживает GET только. Как я могу решить проблему? Просьба помочь. (Мой код работает отлично с IE, но не с другим браузером, например Chrome)

+0

Основываясь на вашем примере, я буду более обеспокоен тем, что IE * * разрешает запрос. – Anthony

+0

Мне нужно, чтобы все работало над хром или другими браузерами. Потому что, наконец, я должен использовать браузеры для смартфонов, чтобы все было сделано. – Surya

+0

В этом случае вы должны подтвердить, что поддержка мобильного браузера 'CORS'. Вот хороший список: http://caniuse.com/cors – Anthony

ответ

4

Две вещи, чтобы проверить (не зная, что ваш серверный язык/техника есть):

  1. А вы в том числе OPTIONS как действительный метод в вашем Access-Control-Allow-Methods? Пример:

    Access-Control-Allow-Methods: GET, OPTIONS 
    
  2. ли пользовательские заголовки, что ваш запрос отсылка возвращается в браузер, как разрешено? Пример:

    Access-Control-Allow-Headers: X-PINGOTHER 
    

Удаленный сервер должен вернуть оба этих (и наиболее определенно второй) перед любым безопасным, соответствующими стандартами браузера (т.е. не более старые версии IE), позволят не-происхождение ответа, чтобы пройти.

Так что, если вы хотите, чтобы осуществить это на уровне HTTP-сервера и сохранить свой портативный веб-сервис, вы можете попробовать следующее:

Мы предположим, что ваш URL веб-сервис http://example.org/service и что путь to service is /srv/www/service

Если вы работаете в Apache 2.0, то синтаксис добавления заголовков add, на 2.2, используйте set.

Таким образом, вы бы изменить /srv/www/service/.htaccess с:

Header set Access-Control-Allow-Methods "GET, OPTIONS" 
Header set Access-Control-Allow-Headers "X-MY_CUSTOM_HEADER1,X-MY_CUSTOM_HEADER2" 
Header set Access-Control-Allow-Origin "*" 

Конечно, Apache модуль mod_headers должен быть включен выше, чтобы работать. Кроме того, установка разрешения-источника на wild card является рискованной, и это фактически приведет к сбою запроса, если вы отправляете заголовок Access-Control-Allow-Credentials: true (в этом случае не можете использовать wild cards). Кроме того, с модемом SetEnvIf для Apache вы можете точно настроить файл htaccess, чтобы возвращать заголовки, когда это необходимо, а не для всех запросов к этому каталогу.

+0

, но у меня есть веб-сервис cxf. Вы говорите, что я должен позволить методам работать с помощью OPTIONS вместе с GET? – Surya

+0

@GET @Produces ({"application/json"}) @Path ("/ getData") public CustomDTO getData() {...} – Surya

+0

Веб-сервис не должен иметь значения. Используете ли вы Apache как фактический HTTP-сервер (который управляет заголовками HTTP до обслуживания веб-службы)? Если это так, вы должны иметь возможность изменять (в файле '.htaccess', я полагаю), как обрабатываются и реагируют запросы. – Anthony