1. 程式人生 > >jquery fileupload設定http request headers

jquery fileupload設定http request headers

CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。

它允許瀏覽器向跨源伺服器,發出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制。

整個CORS通訊過程,都是瀏覽器自動完成,不需要使用者參與。對於開發者來說,CORS通訊與同源的AJAX通訊沒有差別,程式碼完全一樣。瀏覽器一旦發現AJAX請求跨源,就會自動新增一些附加的頭資訊,有時還會多出一次附加的請求,但使用者不會有感覺。

因此,實現CORS通訊的關鍵是伺服器。只要伺服器實現了CORS介面,就可以跨源通訊。

所以下面的配置在服務端比較常見:

        cres.getHeaders().add("Access-Control-Allow-Origin", "*");
        cres.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept");
        cres.getHeaders().add("Access-Control-Allow-Credentials", "true");
        cres.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
        cres.getHeaders().add("Access-Control-Max-Age", "1209600");

其中Access-Control-Allow-Headers控制請求方法中可以包含的請求頭,本文要談的內容跟這個有很大的關係,一般出於安全考慮,我們會在伺服器後端校驗一些引數判斷使用者是否已登入,這些引數一般會在ajax請求頭裡面設定,為了防止某些ajax請求忘記在請求頭中傳遞token等引數,一般會有下面的ajax全域性設定:

    $.ajaxSetup({
    beforeSend: function (request) {
                    request.setRequestHeader("token", xx);
                    request.setRequestHeader("xx", xx);
                    }
  });

這些可能出現的情況就是:不同的伺服器後端配置的Access-Control-Allow-Headers引數不一樣,導致某些請求無法呼叫相應的服務,筆者在使用jquery fileupload的時候就出現了這個問題,其他同事加了這個全域性配置導致檔案無法上傳了,

$('#fileupload').fileupload({
    url: '/path/to/upload/handler.json',
    sequentialUploads: true
});

為了防止ajax的beforeSend的全域性配置影響到fileupload的使用,我們就需要配置fileupload的beforeSend屬性來過濾掉ajax的全域性配置,然後在fileupload的beforeSend方法中設定自己需要的http請求頭,具體配置如下:

$('#fileupload').fileupload({

url: '/path/to/upload/handler.json',

sequentialUploads: true,

beforeSend: function(xhr, data) {
         xhr.setRequestHeader('token', xxxxx);
  } 

});