本博客總結來自曉風清老師課程講解:
https://www.imooc.com/learn/947
歡迎大家對我寫的博客進行吐槽。
三種跨域問題:
1.瀏覽器限制訪問。
2.跨域
3.xmlhttprequest(xhr)請求
解決辦法:
1.瀏覽器禁止檢查(ACAO):
打開window命令窗口: 輸入chrome.exe的路徑我的是 D:\chrome\Chrome\Application\chrome.exe
然後加入--disabled-web-security --user-data-dir=g:\temp3
2.jsonp跨域請求
將ajax中的dataType類型改成jsonp,在後臺中創建一個類並繼承AbstractJsonpResponseBodyAdvice加上@ControllerAdvice註解,然後重寫構造方法,構造方法繼承super("callback");
請求鏈接爲xxx?callback=''&_='',後面參數的作用是爲了防止緩存的出現,如果在ajax的調用參數中加上,cache:true,第二個參數就不會出現。
jsonp的弊端:
1.服務器需要改動代碼支持。
2.只支持get請求。
3.發送的不是xhr請求。
3.解決跨域的兩種方法:
⑴被調用方解決跨域
a、服務器端實現
添加filter
給filter添加兩個response返回的消息頭
reresponse.addHeader("Access-Controle-Allow-Origin","http://localhost:8081")(跨域的地址)
//當有多個域名時,第二個位置用*
reresponse.addHeader("Access-Controle-Allow-Method","GET"),
//當有多個方法時候第二個位置用*
當方法爲options時候,這時候是預檢命令,我們要第二次發送非options的方法,Filter中添加
reresponse.addHeader("Access-Controle-Allow-Headers","Content-Type");
options預檢命令緩存,在一個小時內能夠緩存我們的信息,只需要發送一次post命令,options預檢命令在一個小時內,不用發送了
reresponse.addHeader("Access-Controle-Allow-Age","3600");
帶cookie的跨域(發送的cookie是被調用方的cookie)
ajax中添加參數:xhrFields:{withCredentials:true},Filter裏面的ACAO要明確域名(或者req.getHeader("Origin")獲取問的域名,將value其更改),不能用*
reresponse.addHeader("Access-Controle-Allow-Credentials","true");
帶自定義頭的跨域
ajax中添加參數:headers:{"x-header1":"AAA"}/
beforeSend:function(xhr){xhr.sendRequestHeader("x-header2","BBB")}
獲取自定義跨域:
req.getHeader("Access-Controle-Allow-Headers");//獲取所有跨域頭
b、nginx配置(由於沒有使用過nginx和apache,所以這裏就不細緻講解,大家如果想學,可以上我下面留的網址學習。)
以下是nginx的配置,在vhost文件夾下
這一章具體講解在
c、apache配置
具體去該網址學習:
https://www.imooc.com/video/16592
d、Spring框架解決
添加@CrossOrighin註解,就能解決跨域問題
⑵調用方解決跨域
隱藏跨域
a、 nginx反向代理配置信息:
https://www.imooc.com/video/16594
b、apache反向代理配置
https://www.imooc.com/video/16595