這個項目里面碰到了,但是沒解決,當時是支持get請求,不支持post,於是就把get轉為post。
后來找了點資料
參考鏈接:http://www.xudihui.com/?p=285
可以看到通過在前端增加appid請求頭,訪問node js 搭建的服務器,瀏覽器觸發了OPTIONS 預檢驗請求,但是服務端的響應頭中沒有設置Access-Control-Allow-Origin也沒有允許OPTIONS請求,它卻成功跨域拿到了json數據。發生這種情況首先想到的就是服務器環境不一致,我們后台使用的是java的spring mvc 肯定比node js 復雜千萬倍。於是把這個問題反饋給后台同學,他們通過審查配置文件后發現,OPTIONS在java 的 spring MVC 框架中默認是禁止放行的。資料顯示,框架認為這是不安全的行為,確實,不僅跨域還添加自定義請求頭。於是開始改造后台響應報文,我配合后台一起調試。最后在原有基礎上增加如下配置:
'Access-Control-Allow-Headers', 'appId' 來允許服務器請求中攜帶字段appId,如果還有其它字段,可以用逗號分隔填入;
'Access-Control-Allow-Methods',': POST, GET, OPTIONS'來允許服務器允許客戶端使用 POST, GET 和 OPTIONS 方法發起請求;
添加完畢之后,響應頭中增加對應字段,可以成功實現帶自定義首部字段的跨域通信。
1
2
3
4
5
6
|
//響應頭局部:
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Access-Control-Allow-Headers: appId
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Origin: *
|
但是我們發現每次這種情況都會觸發OPTIONS請求,然后再去執行業務邏輯,雖然正常執行了,但是一個請求變成了兩個,肯定增加了用戶等待時間和服務器資源消耗,於是又在響應頭中增加了Access-Control-Max-Age: 86400;表明該響應的有效時間為 86400 秒,也就是 24 小時。在有效時間內,瀏覽器無須為同一請求再次發起預檢請求。瀏覽器自身維護了一個最大有效時間,如果該首部字段的值超過了最大有效時間,將不會生效。最后同一天內一個接口就只有一次OPTIONS請求啦,大功告成!