剛開始在使用jqueryajax跨域請求zuul網關時,在後臺發現一直拿不到前臺請求的json數據,而前臺也一直拿不到後臺的響應數據。打開瀏覽器調試程序發現,自己ajax的POST請求統一都變成了option,這是怎麼回事呢?java
根本緣由就是,W3C規範這樣要求了!在跨域請求中,分爲簡單請求(get和部分post,post時content-type屬於application/x-www-form-urlencoded,multipart/form-data,text/plain中的一種)和複雜請求。而複雜請求發出以前,就會出現一次options請求。jquery
什麼是options請求呢?它是一種探測性的請求,經過這個方法,客戶端能夠在採起具體資源請求以前,決定對該資源採起何種必要措施,或者瞭解服務器的性能。ajax
在ajax中出現options請求,也是一種提早探測的狀況,ajax跨域請求時,若是請求的是json,就屬於複雜請求,所以須要提早發出一次options請求,用以檢查請求是不是可靠安全的,若是options得到的迴應是拒絕性質的,好比404\403\500等http狀態,就會中止post、put等請求的發出。json
根據這個就好解釋多了,那麼在這裏我更改一下zuul的代碼讓其支持,在這裏定義一個filter,部分代碼以下:跨域
@Override public Object run() throws ZuulException { RequestContext requestContext = RequestContext.getCurrentContext(); String requestBody = null; try { requestBody = StreamUtils.copyToString(requestContext.getRequest().getInputStream(), Charsets.UTF_8); } catch (IOException e) { log.error("", e); } requestContext.addOriginResponseHeader("content-type", "application/json;charset=utf-8"); //設置能夠跨域訪問 requestContext.addZuulResponseHeader("Access-Control-Allow-Headers", "content-type,x-requested-with"); requestContext.addZuulResponseHeader("Access-Control-Allow-Origin", "*"); requestContext.addZuulResponseHeader("content-type", "application/json;charset=utf-8"); // 若是爲options請求則必定要返回200狀態碼 if ("options".equals(requestContext.getRequest().getMethod().toLowerCase())) { requestContext.setSendZuulResponse(false); requestContext.setResponseStatusCode(HttpStatus.OK.value()); return null; } //....省略部分代碼 }