2012-04-25 66 views
1

我有一個網絡服務,它可以在GET上運行。要訪問此Web服務,需要傳遞一些自定義標頭。如何提供網絡服務的飛行前請求

當我嘗試使用GET方法從javascript代碼訪問Web服務時,請求方法變爲OPTIONS。 (域是不同的)

我讀了一些文章,以找出具有自定義標題的請求將預先運行,在這種情況下,在實際的方法調用之前,將向服務器發出帶OPTIONS方法的請求。

但是我的問題是在OPTIONS調用之後,真正的方法(即GET)沒有被調用。

OPTIONS調用返回的狀態爲401

我懷疑這是因爲我的網絡服務只支持GET。我該如何解決這個問題? 請幫忙。 (我的代碼工作正常使用IE瀏覽器,但不與其他瀏覽器如Chrome瀏覽器)

+0

根據你的例子,我會更關心IE *是否允許請求。 – Anthony 2012-04-25 11:07:53

+0

我必須通過Chrome瀏覽器或其他瀏覽器才能使用這些工具。因爲最後我必須使用智能手機瀏覽器才能完成任務。 – Surya 2012-04-25 11:23:16

+0

在這種情況下,您應該確認手機瀏覽器支持'CORS'。這裏有一個很好的列表:http://caniuse.com/cors – Anthony 2012-04-25 11:48:41

回答

4

兩件事情來檢查(不知道你的服務器端語言/技術是什麼):

  1. 你包括OPTIONS作爲您的Access-Control-Allow-Methods的有效方法?示例:

    Access-Control-Allow-Methods: GET, OPTIONS 
    
  2. 您的請求發送的自定義標頭是否被允許返回瀏覽器? 例子:

    Access-Control-Allow-Headers: X-PINGOTHER 
    

遠程服務器有任何安全的,符合標準的瀏覽器之前返回這兩個(和最絕的第二個)(即不是舊版本的IE),將允許非原產地迴應通過。

所以,如果你想在HTTP服務器級別來實現這一點,讓您的網絡服務的便攜式,你可以嘗試以下操作:

我們假設你的web服務的URL是http://example.org/service並且路徑要服務/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 "*" 

當然,mod_headers Apache模塊必須對上述工作。另外,將允許來源設置爲通配符是有風險的,並且如果您發送標頭Access-Control-Allow-Credentials: true(在這種情況下不能使用通配符),它實際上會導致請求失敗。此外,使用SetEnvIf mod的Apache,您可以對htaccess文件進行微調,以便在適當時僅返回標頭,而不是對該目錄的所有請求。

+0

但我有一個cxf網絡服務。你是說我必須讓方法和GET一起使用OPTIONS? – Surya 2012-04-25 11:16:14

+0

@GET @Produces({「application/json」}) @Path(「/ getData」) public CustomDTO getData(){...} – Surya 2012-04-25 11:18:01

+0

Web服務應該沒關係。您是否使用Apache作爲實際的HTTP服務器(在提供Web服務之前管理HTTP標頭)?如果是這樣,你應該能夠修改(在'.htaccess'文件中,我假定)如何處理和響應請求。 – Anthony 2012-04-25 11:20:20

相關問題