天天看點

前後端項目分離-----跨域問題跨域基礎認知前後端分離的項目跨域

跨域基礎認知

1.跨域------說明最少有兩個域,才會出現跨的這種情況

2.跨域問題出現的本質 a.域名不同,b.端口号不同,c.協定 不同

3,浏覽器的同源政策-----(非位址欄請求),如a頁面在a服 務器,b頁面在b伺服器,在a頁面請求b頁面的資訊就會出現跨域問題,目的是為了保證使用者資訊安全(如果a頁面可以擷取b頁面資訊,相對的session資訊,cookie資訊,等使用者身份辨別資訊就可以被模拟通路,網際網路上就毫無秘密可言了)

4.浏覽器位址欄輸入請求url(解析域名成ip位址,建立tcp連接配接,接入伺服器,傳回資源,浏覽器渲染,此時浏覽器器直接通路伺服器,隻有一個伺服器域)

5,使用ajax請求(此時ajax代碼是一個域,伺服器是一個域)

前後端分離的項目跨域

1.跨域請求時,浏覽器會先發送一個(options方法)預請求檢查是否跨域,傳回成功才會發送正真的請求,隻要檢查響應頭裡面是否添加了允許跨域的響應頭設定。

2.springboot項目後端使用(@CrossOrigin(origins = “*”)注解,允許任何域通路

3.問題是—攔截器存在的時候,這個注解會失效

原因:因為請求到達攔截器時,還沒能夠到具體請求此時

能對注解進行解析,得不到允許跨域的信号提示,

是以會出現跨域問題,

解決辦法:攔截器裡對相應頭裡做允許跨域的相應頭設定

/* 允許跨域的主機位址 */
    response.setHeader("Access-Control-Allow-Origin", "*");
    /* 允許跨域的請求方法GET, POST, HEAD 等 */
    response.setHeader("Access-Control-Allow-Methods", "*");
    /* 重新預檢驗跨域的緩存時間 (s) */
    response.setHeader("Access-Control-Max-Age", "3600");
    /* 允許跨域的請求頭 */
    response.setHeader("Access-Control-Allow-Headers", "*");
           

總結:第一次遇到這個問題,感覺還是很神奇的,之前一直沒有想到servlet這個點,因為請求已經到達了伺服器中,已經算是跨域了,但是此時還沒有進行處理器映射和處理器适配,就沒有到達controller層就不會出現解析注解的器概況,就會出現跨域問題

備注:走攔截器的就可以不用使用注解了,不走攔截器的還是需要使用注解

繼續閱讀