經過Ajax的訪問zuul的跨域問題解決方案

剛開始在使用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;
            }
         //....省略部分代碼 
        }
相關文章
相關標籤/搜索