ajax 跨域 完全詳解

基於前後端分離的項目是大勢所趨,避免不了跨域
問什麼會發生ajax跨域安全:【三個請求同時滿足纔可能發生跨域安全問題】
1.瀏覽器安全限制,請求正常發送並返回,瀏覽器處理對請求的校驗
解決方案: 要求瀏覽器禁止檢查,命令參數方式啓動瀏覽器 eg:chrome.exe --disable-web-security --user-data-dir=d:\temp3

2.跨域,請求發生的協議,域名,端口不一致
解決方案:JSONP請求方式;appending,動態創建script標籤方式請求,但是不滿足前後端開發需求,需要後臺改動,且只支持GET請求.
    增加AbstractJsonpResponseBodyAdvice自定義類(使用方式自己另外百度),
    默認構造器裏增加super("callback");callback默認前後臺約定,可以更改

請求url是callback=jQuery.....=_時間戳,請求返回的數據是jquery函數調用式,最後一個參數是防止請求被緩存了,若請求時候加cache:true則無此參數
返回的數據類型是application/javascript,而普通請求返回是application/json,動態創建動態銷燬,可通過debug模式查看腳本的創建和銷燬

3.XHR(XMLHttpRequest)請求方式,其他請求方式,瀏覽器不會做跨域限制
解決方案:
    3.1被調用方(http協議增加響應頭字段:)
        3.1.1服務器端實現:瀏覽器先執行後判斷?,跨域判斷方法,request請求頭中增加了Origin信息
            增加Filter 自定義類配置url攔截規則,在dofilter方法裏增加response響應頭(FilterRegistrationBean)

            Access-Control-Allow-Origin:request.getHeader("Origin") 一般都是request裏多了哪些請求頭就加哪些
               * 不能滿足帶cookie的跨域
            Access-Control-Allow-Credentials:true  允許cookie跨域請求
            Access-Control-Allow-Methods:GET,POST,PUT等
            Access-Control-Allow-Headers:Content-Type等 帶自定義頭請求,
                自適應request.getHeader("Access-Control-Allow-Headers")
            Access-Control-Max-Age:秒  瀏覽器預檢命令緩存時間

            簡單請求:Content-Type爲以下三種:text/plain;multipart/form-data;application/x-www-form-urlencoded
            非簡單請求:常見的有put,delete方法的ajax請求;
            發送json格式,post方法用@RequestBody接受請求;

            帶cookie的請求xhrFields:{ withCredentials:true }
            document.cookie='cookie1=test' 加在被調用方的域名下
            
        3.1.2NGIXN配置:
            虛擬主機:多個域名指向同一個服務器,服務器根據不同域名把請求轉到不同服務器,實際只有一個主機
            增加HOSTS域名:127.0.0.1 被調用方域名,多個eg:a.com
            nginx/conf下新建vhost目錄,打開nginx.conf倒數最後大括號前增加include vhost/*.conf;載入自定義配置文件
            vhost/a.conf新建內容:
            server{
                listen:80;
                server_name a.com;
                
                location /{
                    proxy_pass http://localhost:8080/; //所有請求都轉發到8080服務器
                    add_header Access-Control-Allow-Origin $http_origin;
                    add_header Access-Control-Allow-Methods *;
                    add_header Access-Control-Allow-Credentials true;
                    add_header Access-Control-Allow-Headers $http_access_control_request_headers;
                    //預檢命令處理[if帶空格]
                    if ($request_method = OPTIONS){
                        return 200;
                    }
                }
            }
            nginx.exe -t測試配置文件是否正確
            start nginx.exe啓動
            nginx.exe -s reload配置重新加載
            nginx.exe -s stop 停止nginx
        3.1.3APACHE配置
            apache/conf/httpd.conf  mod_vhost_alias.so模塊打開,httpd-vhosts.conf配置文件項打開
                打開代理Proxy-140 mod_proxy.so打開 Proxy-149 mod_proxy_http.so打開
                打開請求頭:mod_headers.so打開 mod_rewrite.so打開
            apache/conf/extra/httpd-vhosts.conf虛擬主機配置文件 
                新增最後一節點,ServerName改成eg:a.com; ProxyPass / http://locahost:8080/  其他日誌可以改下
                


            啓動apache/bin/httpd.exe
        3.1.4 Spring 增加@CrossOrigin註解
        
    3.2調用方
        隱藏跨域
        反向代理 配置nginx
        增加文件b.conf
        server{
            listen 80;
            server_name b.com;
            location /{
                proxy_pass http://locahost:8081/;
            }
            //服務器代理地址
            location /ajaxserver{
                proxy_pass http://locahost:8080/test;
            }
        }
        a.com域名下的/ajaxserver請求被代理到http://locahost:8080/test,而/被代理到8081正確的域名服務器下
        
        Apache代理同nginx差不多
 

備註:參照慕課網ajax跨域完全詳解,如有問題還請多多留言,謝謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章