2013-01-23 75 views
1

我讀了很多關於「訪問控制 - 允許 - 來源」問題的論壇。大多數論壇都要求使用dataType:'jsonp',但是通常jsonp會打到GET請求,我想要做POST請求。最終GET請求也不起作用。訪問控制 - 允許 - 源錯誤發送一個jQuery發佈

其實我將iPhone應用程序轉換爲PhoneGap,所以重新編寫客戶代碼到HTML-5 & Jquery mobile。我試圖打的網址在Objective-C中效果很好。

這裏是Objective-C代碼

NSString *username=[self urlEncodeValue:[userNameField.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]]; 
NSString *password=[self urlEncodeValue:[passWordField.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]]; 
NSString *params = [[NSString alloc] initWithFormat:@"username=%@&password=%@",username,password]; 

NSData *paramData = [params dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
[params release]; 
NSString *paramsLength = [NSString stringWithFormat:@"%d", [paramData length]]; 

NSString *urlString=[[NSString alloc] initWithFormat:@"%@?",[dict valueForKey:@"LoginAuthentication"]]; 

NSURL *authURL = [NSURL URLWithString:urlString]; 
[urlString release]; 

NSHTTPURLResponse *authenticationResponse= nil; 
NSMutableURLRequest *authenticationRequest = [NSMutableURLRequest requestWithURL:authURL]; 
[authenticationRequest setHTTPMethod:@"POST"]; 
[authenticationRequest setValue:paramsLength forHTTPHeaderField:@"Content-Length"]; 
[authenticationRequest setHTTPBody:paramData]; 
NSError *error = nil; 
int errorCode; 

NSData *responseData = [NSURLConnection sendSynchronousRequest:authenticationRequest 
      returningResponse:&authenticationResponse 
      error:&error]; 

if ([authenticationResponse respondsToSelector:@selector(allHeaderFields)]) { 
    //success 
} 

上面的代碼工作得很好。

這裏是我轉換爲JavaScript代碼這給「訪問控制允許來源」錯誤

$(document).ready(function() { 
    $.ajax({ 
     type: "POST", 
     crossDomain: true, 
     //dataType:'jsonp', 
     //callback: '?', 
     url : "https://externalserver.com/loginAuth?", 
      data : {'username' : 'username', 'password' : 'password'}, 
     success : function (response) { 
      alert('login failed'); 
     }, 
     error: function(e){ 
      console.log(e);    
     } 
    }); 
}); 

我試着用GET/POST請求,並試圖運行一些本地服務器這個本地文件。什麼都沒有

我收到以下錯誤消息

的XMLHttpRequest無法加載https://externalserver.com/loginAuth? Access-Control-Allow-Origin不允許原始位置爲null。

XMLHttpRequest無法加載https://externalserver.com/loginAuth? Access-Control-Allow-Origin不允許原始位置爲null。

+0

您是否將網址添加到白名單? –

+0

是的,我已經在白名單中添加了網址。順便說一句,我在瀏覽器中出錯。 – gviswanathan

+1

當你在瀏覽器中發現這個錯誤時,你是通過服務器訪問你的網頁還是直接從你的電腦打開html文件? – Romain

回答

1

一個PhoneGap的應用程序作爲移動應用處理,而不是瀏覽器,跨來源是罰款。你需要改變你的服務器代碼中加入這個頭

Access-Control-Allow-Origin: * 

這將使空的起源是什麼PhoneGap的請求被髮送作爲。這應該適用於GET和POST請求,無需使用JSONP。

+0

謝謝。這將工作的POST請求? – gviswanathan

+0

答案更新 - 是的,它適用於GET和POST – codemonkey

1

瀏覽器不允許您從另一個域請求資源(圖像和腳本文件是該規則的顯着例外)。

這可以用幾種方法解決。

  1. 第一種方法是使用JSONP調用(跨域訪問的當前標準),並且是JSONP只允許GET。但這只是解決方案的一部分。服務器端也需要更改以允許跨域調用。

    爲了能夠從javascript訪問外部資源。遠程資源必須在響應頭中包含訪問控制允許來源。如果您可以控制該資源,則需要將此響應標頭添加到*(或者如果您想要更受限制的訪問控制,則爲您的域)。當然,這部分OD解決方案將depent上

    這裏有一個PHP/jQuery的解決方案中的細節描述你的服務器端架構(PHP,ASP.NET,JSP ...):http://www.fbloggs.com/2010/07/09/how-to-access-cross-domain-data-with-ajax-using-jsonp-jquery-and-php/

    而且返回結果都必須包到jsonpCallback功能,所以收益應該liek這樣的:

    someFunction("{...}"); 
    

    someFunction是回調函數的名稱和經典JSON是{....}。你可以看到,它是用包裝的一些功能(

    jQuery的側面看起來應該是這樣:

    $.ajax({url: server_url, 
        type: "GET",  
        data: save_data, 
        dataType: "jsonp", 
        jsonpCallback: 'successCallback', 
        async: true, 
        beforeSend: function() { 
    
        }, 
        complete: function() { 
    
        }, 
        success: function (result) { 
    
        }, 
        error: function (request,error) { 
    
        }, 
        successCallback:function(){ 
    
        } 
    }); 
    

    http://devlog.info/2010/03/10/cross-domain-ajax/

  2. 或代理解決方案。我不會寫這篇文章,因爲我從來沒有測試過它。只有當你沒有服務器端代碼訪問使用此解決方案:

    http://jquery-howto.blogspot.com/2009/04/cross-domain-ajax-querying-with-jquery.html http://developer.yahoo.com/javascript/howto-proxy.html

相關問題