解讀前后端分離項(xiàng)目的跨域問(wèn)題
跨域問(wèn)題的原因
根本原因:瀏覽器有同源策略限制,當(dāng)前域名的js只能讀取同城下的窗口屬性,這是一個(gè)基礎(chǔ)安全功能
同源策略
若兩資源的URL中的協(xié)議、域名、端口都相同就成為同源,如果兩資源不同源,則不允許共享資源。
例如:http://www.baidu.com/a/hello.html
| 請(qǐng)求地址 | 結(jié)果 | 原因 |
http://www.baidu.com/a/java.html | 成功 | 同一域名端口,相同文件夾 |
http://www.baidu.com/b/hello.html | 成功 | 同一域名端口,不同文件夾 |
https://www.baidu.com/a/hello.html | 失敗 | 不同協(xié)議,http與https |
http://www.baidu.com:8081/a/java.html | 失敗 | 不同端口,默認(rèn)為8080端口 |
| http://www.sina.com:8081/a/java.html | 失敗 | 不同域名 |
跨域CORS
跨域就是解決不同域之間可以進(jìn)行資源的相互訪問(wèn),為了避開瀏覽器的同源政策
CORS出現(xiàn)之前
瀏覽器接收到服務(wù)器回復(fù)—>檢查是否同源—>同源就響應(yīng),不同源就拒絕相應(yīng)
CORS出現(xiàn)之后
瀏覽器接收到服務(wù)器回復(fù) --> 檢查一下response header --> 發(fā)現(xiàn)有特定字段Access-Control-Allow-Origin --> 檢查這個(gè)header后面的值包不包含自己所在的域(打比方我們現(xiàn)在在www.baidu.com),瀏覽器檢查發(fā)現(xiàn)后response header里面寫的有Access-Control-Allow-Origin: https://www.baidu.com, 并且https://www.google.com正好我們?cè)谠试S的域里面! --> 瀏覽器響應(yīng)服務(wù)器返回的數(shù)據(jù)(response)。
瀏覽器要實(shí)現(xiàn)的內(nèi)容:
- 接收到服務(wù)器的回復(fù)之后檢測(cè)回復(fù)頭里面是否含有特定字段!
- 有的話查看自己的域名是否在內(nèi),一定要這兩個(gè)條件都符合!
- 瀏覽器才會(huì)接受(或者說(shuō)響應(yīng))服務(wù)器返回的回復(fù)!
服務(wù)器需要實(shí)現(xiàn)的內(nèi)容:
- 服務(wù)器需要在接受到瀏覽器發(fā)來(lái)的請(qǐng)求(request)后,在返回response之前!
- 設(shè)置header,在header中里面包含特定字段,以便瀏覽器收到回復(fù)之后可以去檢查,有字段證明服務(wù)器同意服務(wù)這個(gè)網(wǎng)站,瀏覽器就可以接受回復(fù),沒有字段或者字段的值不包含發(fā)送請(qǐng)求的網(wǎng)站,瀏覽器就不會(huì)響應(yīng)回復(fù)內(nèi)容!
后端解決跨域問(wèn)題的幾種方式
第一種:在application文件里

第二種:在配置類里加上注解

第三種:在過(guò)濾器里設(shè)置
@WebFilter(filterName = "CorsFilter ")
@Configuration
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin","*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
HttpServletRequest httpRequest = (HttpServletRequest) req;
// OPTIONS method response
if (httpRequest.getMethod().equals("OPTIONS"))
((HttpServletResponse) res).sendError(HttpServletResponse.SC_OK);
chain.doFilter(req, res);
}
}
跨域的前端處理

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java?ThreadPoolExecutor線程池內(nèi)部處理流程解析
這篇文章主要為大家介紹了java?ThreadPoolExecutor線程池內(nèi)部處理流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
spring?boot?mybatis日志輸出到控制臺(tái)的方法實(shí)踐
在開發(fā)過(guò)程中我們往往需要打印出SQL語(yǔ)句,這樣就方便我們監(jiān)控問(wèn)題,本文主要介紹了spring?boot?mybatis日志輸出到控制臺(tái)的方法實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05
Spring通過(guò)配置文件管理Bean對(duì)象的方法
這篇文章主要介紹了Spring通過(guò)配置文件管理Bean對(duì)象的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
Java高級(jí)用法中的JNA類型映射注意細(xì)節(jié)及使用問(wèn)題
本文介紹了在使用JNA方法映射中應(yīng)該注意的一些細(xì)節(jié)和具體的使用問(wèn)題,對(duì)java??JNA類型映射注意細(xì)節(jié)感興趣的朋友一起看看吧2022-04-04
Mybatis以main方法形式調(diào)用dao層執(zhí)行代碼實(shí)例
這篇文章主要介紹了Mybatis以main方法形式調(diào)用dao層執(zhí)行代碼實(shí)例,MyBatis 是一款優(yōu)秀的持久層框架,MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作,需要的朋友可以參考下2023-08-08
淺談Java實(shí)現(xiàn)分布式事務(wù)的三種方案
現(xiàn)在互聯(lián)網(wǎng)下,分布式和微服務(wù)橫行,難免會(huì)遇到分布式下的事務(wù)問(wèn)題,當(dāng)然微服務(wù)下可能沒有分布式事務(wù),但是很多場(chǎng)景是需要分布式事務(wù)的。下面就來(lái)介紹下什么是分布式事務(wù)和分布式事務(wù)的解決方案2021-06-06
Java動(dòng)態(tài)編譯執(zhí)行代碼示例
這篇文章主要介紹了Java動(dòng)態(tài)編譯執(zhí)行代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
Java 中的Printstream介紹_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
PrintStream 是打印輸出流,它繼承于FilterOutputStream。接下來(lái)通過(guò)本文給大家介紹Java 中的Printstream,需要的朋友參考下吧2017-05-05

