更新時(shí)間:2023-03-15 來(lái)源:黑馬程序員 瀏覽量:
瀏覽器判斷是跨域請(qǐng)求會(huì)在請(qǐng)求頭上添加origin,表示這個(gè)請(qǐng)求來(lái)源哪里。比如:
Plaintext GET / HTTP/1.1 Origin: http://localhost:8601
服務(wù)器收到請(qǐng)求判斷這個(gè)Origin是否允許跨域,如果允許則在響應(yīng)頭中說(shuō)明允許該來(lái)源的跨域請(qǐng)求,如下:
Plaintext Access-Control-Allow-Origin:http://localhost:8601
如果允許任何域名來(lái)源的跨域請(qǐng)求,則響應(yīng)如下:
Plaintext Access-Control-Allow-Origin:*
解決跨域的方法:
1、JSONP
通過(guò)script標(biāo)簽的src屬性進(jìn)行跨域請(qǐng)求,如果服務(wù)端要響應(yīng)內(nèi)容則首先讀取請(qǐng)求參數(shù)callback的值,callback是一個(gè)回調(diào)函數(shù)的名稱(chēng),服務(wù)端讀取callback的值后將響應(yīng)內(nèi)容通過(guò)調(diào)用callback函數(shù)的方式告訴請(qǐng)求方。如下圖:
2、添加響應(yīng)頭
服務(wù)端在響應(yīng)頭添加 Access-Control-Allow-Origin:
3、通過(guò)nginx代理跨域
由于服務(wù)端之間沒(méi)有跨域,瀏覽器通過(guò)nginx去訪(fǎng)問(wèn)跨域地址。
1)瀏覽器先訪(fǎng)問(wèn)http://192.168.101.10:8601 nginx提供的地址,進(jìn)入頁(yè)面
2)此頁(yè)面要跨域訪(fǎng)問(wèn)http://192.168.101.11:8601 ,不能直接跨域訪(fǎng)問(wèn)http://www.baidu.com:8601 ,而是訪(fǎng)問(wèn)nginx的一個(gè)同源地址,比如:http://192.168.101.11:8601/api ,通過(guò)http://192.168.101.11:8601/api 的代理去訪(fǎng)問(wèn)http://www.baidu.com:8601。
這樣就實(shí)現(xiàn)了跨域訪(fǎng)問(wèn)。
瀏覽器到http://192.168.101.11:8601/api 沒(méi)有跨域
nginx到http://www.baidu.com:8601通過(guò)服務(wù)端通信,沒(méi)有跨域。
我們準(zhǔn)備使用方案2解決跨域問(wèn)題。在內(nèi)容管理的api工程config包下編寫(xiě)GlobalCorsConfig.java,
或直接從課程資料/項(xiàng)目工程下拷貝,
代碼如下:
Java package com.xuecheng.system.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; /** * @description 跨域過(guò)慮器 * @author Mr.M * @date 2022/9/7 11:04 * @version 1.0 */ @Configuration public class GlobalCorsConfig { /** * 允許跨域調(diào)用的過(guò)濾器 */ @Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); //允許白名單域名進(jìn)行跨域調(diào)用 config.addAllowedOrigin("*"); //允許跨越發(fā)送cookie config.setAllowCredentials(true); //放行全部原始頭信息 config.addAllowedHeader("*"); //允許所有請(qǐng)求方法跨域調(diào)用 config.addAllowedMethod("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } }
此配置類(lèi)實(shí)現(xiàn)了跨域過(guò)慮器,在響應(yīng)頭添加Access-Control-Allow-Origin。
重啟系統(tǒng)管理服務(wù),前端工程可以正常進(jìn)入http://localhost:8601,觀察瀏覽器記錄,成功解決跨域。
【AI設(shè)計(jì)】北京143期畢業(yè)僅36天,全員拿下高薪offer!黑馬AI設(shè)計(jì)連續(xù)6期100%高薪就業(yè)
2025-09-19【跨境電商運(yùn)營(yíng)】深圳跨境電商運(yùn)營(yíng)畢業(yè)22個(gè)工作日,就業(yè)率91%+,最高薪資達(dá)13500元
2025-09-19【AI運(yùn)維】鄭州運(yùn)維1期就業(yè)班,畢業(yè)14個(gè)工作日,班級(jí)93%同學(xué)已拿到Offer, 一線(xiàn)均薪資 1W+
2025-09-19【AI鴻蒙開(kāi)發(fā)】上海校區(qū)AI鴻蒙開(kāi)發(fā)4期5期,距離畢業(yè)21天,就業(yè)率91%,平均薪資14046元
2025-09-19【AI大模型開(kāi)發(fā)-Python】畢業(yè)33個(gè)工作日,就業(yè)率已達(dá)到94.55%,班均薪資20763元
2025-09-19【AI智能應(yīng)用開(kāi)發(fā)-Java】畢業(yè)當(dāng)天offer率91%,薪資1W+占比54.2%,班級(jí)均薪12k+
2025-09-19