遇到的問題:已經在ajax里面添加自定義參數,但是沒有生效
beforeSend : function(request) { request.setRequestHeader("regionCode", regionCode); }
參數如下:
客戶端 按照原來的寫,你需要處理的是 服務端 響應頭的設置
1.第一步 設置響應頭
header('Access-Control-Allow-Origin:*'); //支持全域名訪問,不安全,部署后需要固定限制為客戶端網址
header('Access-Control-Allow-Methods:POST,GET,OPTIONS,DELETE'); //支持的http 動作
header('Access-Control-Allow-Headers:x-requested-with,content-type'); //響應頭 請按照自己需求添加。
2.第二部 了解IE chrome 等瀏覽器 對於 跨域請求並要求設置Headers自定義參數的時候的 "預請求" 就是如果遇到 跨域並設置headers的請求,所有請求需要兩步完成!
A 第一步:發送預請求 OPTIONS 請求。此時 服務器端需要對於OPTIONS請求作出響應 一般使用202響應即可 不用返回任何內容信息。(能看到這份手稿的人,本人不相信你后台處理不了一個options請求)
B 第二步:服務器accepted 第一步請求后 瀏覽器自動執行第二步 發送真正的請求。此時 大多數人 會發現請求成功了,但是 有那么幾個人會發現 請求成功了但是沒有任何信息返回 why?因為你自定義的請求頭在服務器響應中不存在!
查看console輸出 會發現一個問題:
“Access-Control-Allow-Headers 列表中不存在請求標頭 XXXXXX”【IE】,
request header field xxxxxx is not allowed by Access-Control-Allow-Header【chrome】
這是因為 你的XXXX請求頭 沒有在服務器端被允許哦~
遇到這個問題 只有通過修改服務器端來完成,舉例:需要設置 requesttype這么一個自定義頭,那么 你需要在 服務端里面 將header('Access-Control-Allow-Headers:x-requested-with,content-type,requesttype'); 同學們自行體會吧 這種語法就是根據“,”分割 自己需要設置什么頭,必須要在 服務端請求的響應頭里面設置好,不然客戶端永遠永遠提交不上去!
至此 JavaScript/ajax 跨域+ 修改httpheader 任務完美實現。
"人們都一直在抱怨 JavaScript同源策略限制了web前端的發展!然而是服務端做的不夠細致!"
部分代碼參考如下:代碼只是提供了思想,具體步驟還要根據以上的文字 自行揣摩實現。以上內容看不懂 說明對於web一點也不了解,需要買本書看看嘍~
客戶端代碼:
服務器端代碼