1、現象描述
寫好的接口部署到了公司內網環境上,交給前端聯調時卻出現了下面的問題:
Access to XMLHttpRequest at 'xxx' from origin 'xxx' has been blocked by CORS policy: No
'Access-Control-Allow-Origin' header is present on the requested resource.
2、問題分析
與前端人員溝通後,發現前端人員是在他本機啓了一個vue前端工程,運行地址爲localhost:8080,而接口所在服務器地址爲192.168.xx.xx,此時前端調用接口就屬於跨域的HTTP請求(cross-origin HTTP requests),而默認情況下瀏覽器出於安全性考慮會限制這種請求,這也是報錯中出現“xxx has been blocked by CORS policy”的原因。
CORS,全稱爲Corss-Origin Resource Sharing,即跨域資源共享,它是這樣一種機制,該機制使用額外的HTTP頭部信息告訴瀏覽器在一個域中運行的web應用可以訪問來自不同域的資源,但是這種頭部信息默認是沒有添加的,也就是說默認情況下不允許跨域訪問。
當web application請求一個不同於自身域(包括域名、協議和端口上的不同)的資源時,會執行cross-origin請求。
3、問題解決
清楚了問題發生的根源後,我們只需添加這樣一條響應頭信息即可,詳見下面代碼:
@GetMapping("nodeWarn")
public JSONObject selectNodeWarning(HttpServletRequest request, HttpServletResponse response,
@RequestParam(value = "period", required = false) String period,
@RequestParam(value = "caseType", required = false) String caseType) {
response.setHeader("Access-Control-Allow-Origin", "*");
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "Peter");
return jsonObject;
}
Access-Control-Allow-Origin爲*表示該資源能被任何域訪問。
4、總結
當然上面只是在Java接口中的解決辦法,還有在其他地方解決該問題的辦法,等遇到再進行整理。