springboot+vue項(xiàng)目怎么解決跨域問題詳解
1. 前端代理(開發(fā)環(huán)境推薦)
適用場景:Vue 開發(fā)環(huán)境調(diào)試時(shí),避免直接請求后端接口的跨域問題。
實(shí)現(xiàn)步驟:
在 Vue 項(xiàng)目的
vue.config.js
中配置代理:module.exports = { devServer: { proxy: { '/api': { // 代理所有以 /api 開頭的請求 target: 'http://localhost:8080', // Spring Boot 后端地址 changeOrigin: true, // 允許跨域 pathRewrite: { '^/api': '' // 去除請求路徑中的 /api 前綴 } } } } }
2.前端請求時(shí)使用
/api
前綴:axios.get('/api/users').then(response => { // 處理響應(yīng) });
優(yōu)點(diǎn):無需修改后端代碼,適合開發(fā)階段快速解決跨域。
2. 后端全局配置 CORS(生產(chǎn)環(huán)境推薦)
適用場景:生產(chǎn)環(huán)境需要后端直接支持跨域。
實(shí)現(xiàn)步驟:
在 Spring Boot 中創(chuàng)建全局 CORS 配置類:
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 所有接口 .allowedOrigins("http://localhost:5173") // 允許的前端地址 .allowedMethods("GET", "POST", "PUT", "DELETE") // 允許的請求方法 .allowedHeaders("*") // 允許的請求頭 .allowCredentials(true) // 允許發(fā)送 Cookie .maxAge(3600); // 預(yù)檢請求緩存時(shí)間(秒) } }
2.若使用 Spring Security,需額外放行 OPTIONS 請求(預(yù)檢請求):
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.cors() // 啟用 CORS .and() // 其他安全配置... .authorizeRequests() .requestMatchers(HttpMethod.OPTIONS).permitAll() // 放行 OPTIONS 請求 .anyRequest().authenticated(); return http.build(); } }
3. 后端注解配置(按接口控制)
適用場景:僅特定接口需要跨域支持。
實(shí)現(xiàn)步驟:在 Controller 或方法上添加 @CrossOrigin
注解:
@RestController @CrossOrigin(origins = "http://localhost:5173") // 類級別注解 public class UserController { @GetMapping("/users") @CrossOrigin(origins = "http://localhost:5173") // 方法級別注解 public List<User> getUsers() { // 業(yè)務(wù)邏輯 } }
4. Nginx 反向代理(生產(chǎn)環(huán)境終極方案)
適用場景:前后端部署到同一域名下,徹底避免跨域。
實(shí)現(xiàn)步驟:
配置 Nginx,將前端請求代理到后端接口:
server { listen 80; server_name your-domain.com; # 前端靜態(tài)資源 location / { root /path/to/vue/dist; index index.html; try_files $uri $uri/ /index.html; } # 后端 API 代理 location /api { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
2.重啟 Nginx:
sudo nginx -s reload
總結(jié)
方案 | 適用場景 | 優(yōu)點(diǎn) | 缺點(diǎn) |
---|---|---|---|
前端代理 | 開發(fā)環(huán)境 | 無需后端改動(dòng),快速解決跨域 | 僅適用于開發(fā)環(huán)境 |
后端全局 CORS | 生產(chǎn)環(huán)境 | 統(tǒng)一管理,安全性可控 | 需后端配置 |
注解配置 | 特定接口跨域 | 靈活控制單個(gè)接口 | 配置冗余,維護(hù)成本高 |
Nginx 反向代理 | 生產(chǎn)環(huán)境部署 | 徹底解決跨域,提升性能 | 需運(yùn)維支持 |
推薦組合:
開發(fā)環(huán)境:前端代理(方案1) + 后端全局 CORS(方案2)。
生產(chǎn)環(huán)境:Nginx 反向代理(方案4) + 后端全局 CORS(方案2,雙重保障)。
到此這篇關(guān)于springboot+vue項(xiàng)目怎么解決跨域問題的文章就介紹到這了,更多相關(guān)springboot+vue解決跨域問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ReentrantReadWriteLock不能鎖升級的原因總結(jié)
今天給大家?guī)淼氖顷P(guān)于Java并發(fā)的相關(guān)知識,文章圍繞著為什么ReentrantReadWriteLock不能鎖升級展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06java&javascript自定義加密數(shù)據(jù)傳輸代碼示例
這篇文章主要介紹了java&javascript自定義加密數(shù)據(jù)傳輸代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11MySQL查詢字段實(shí)現(xiàn)字符串分割split功能的示例代碼
本文主要介紹了MySQL查詢字段實(shí)現(xiàn)字符串分割split功能的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01詳談Servlet和Filter的區(qū)別以及兩者在Struts2和Springmvc中的應(yīng)用
下面小編就為大家?guī)硪黄斦凷ervlet和Filter的區(qū)別以及兩者在Struts2和Springmvc中的應(yīng)用。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08Java?IO網(wǎng)絡(luò)模型實(shí)現(xiàn)解析
這篇文章主要為大家介紹了Java?IO網(wǎng)絡(luò)模型實(shí)現(xiàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03GC算法實(shí)現(xiàn)篇之并發(fā)標(biāo)記清除
這篇文章主要為大家介紹了GC算法實(shí)現(xiàn)篇之并發(fā)-標(biāo)記-清除,?CMS垃圾收集器在減少停頓時(shí)間上做了很多給力的工作,?大量的并發(fā)線程執(zhí)行的工作并不需要暫停應(yīng)用線程2022-01-01