問題一:No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
瀏覽器的策略本質:處於安全考慮,一個域下面的JS,沒有經過允許是不能讀取另外一個域的內容;
ajax請求會通過跨域請求拿到響應數據這樣是不安全。
但是瀏覽器不阻止你向另外一個域發送請求,對於form表單提交來說,原先頁面無法獲取新頁面的內容;
瀏覽器的安全策略限制的是js腳本,並不限制src,form表單提交之類的請求。就是說form表單提交不存在安全問題,ajax提交跨域存在安全問題。
跨域:在當前頁面想要訪問其他頁面,主要端口、ip、協議有一個不一樣就會被定義為跨域;
例如:
在前后端分離的項目中,一個熟悉的場景:前端頁面發送ajax請求給后端,后端返回json數據,前端拿到返回的數據進行響應的頁面跳轉以及數據的展示;
前端:http://front.smile.com:5500/login.html;頁面發送ajax請求,給后端http://backend.smile.com:8080/user/login;跨域產生的原因此處就是原地址和目的地址端口和域名不一致;
第一次跨域產生:No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
跨域解決辦法一:目的服務器進行跨域允許配置;
@Configuration public class ConfigurationCors implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") //項目中的所有/getTitle/**支持跨域 .allowedOriginPatterns("*")//所有地址都可以訪問,也可以配置具體地址 .allowCredentials(true) .allowedMethods("*")//"GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS" .maxAge(3600);// 跨域允許時間 } }
問題二:The ‘Access-Control-Allow-Origin’ header contains multiple values ‘http://front.smile.com:5500, *’, but only one is allowed.
背景:下圖簡要描述非正式nginx服務器來搭建https服務場景,前端發送請求給后端,由於是https協議,首先nginx443端口會監聽到這個請求,然后幫助去找到目標代理服務器;
如問題一所示,這邊是會出現跨域請求的,然后解決方法可以選擇第一種在目的服務器上面設置,也可以在nginx服務器上面進行配置;
跨域解決辦法二:
location / { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; if ($request_method = 'OPTIONS') { return 204; } }
這邊我一開始沒有將目的服務器的配置設置關閉,導致nginx和目的服務器都設置了跨域允許,導致Access-Control-Allow-Origin值重復;The ‘Access-Control-Allow-Origin’ header contains multiple values ‘http://front.smile.com:5500, *’, but only one is allowed.可以在響應頭中看到確實重復;