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