springboot解決前后端分離時的跨域問題
隨著分布式微服務(wù)的興起,越來越多的公司在開發(fā)web項目的時候選擇前后端分離的模式開發(fā),前后端分開部署,使得分工更加明確,徹底解放了前端。
我們知道,http請求都是無狀態(tài),現(xiàn)在比較流行的都是jwt的形式處理無狀態(tài)的請求,在請求頭上帶上認證參數(shù)(token等),前后端分離有好處,也有壞處,第一次開發(fā)前后端分離項目的人,肯定會遇到前端請求跨域的問題,這個怎么處理呢?在說處理方案前,有必要說明一下為什么會跨域和什么是跨域?
一、為什么會跨域?
出于瀏覽器的同源策略限制。同源策略(Sameoriginpolicy)是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能可能都會受到影響??梢哉fWeb是構(gòu)建在同源策略基礎(chǔ)之上的,瀏覽器只是針對同源策略的一種實現(xiàn)。同源策略會阻止一個域的javascript腳本和另外一個域的內(nèi)容進行交互。所謂同源(即指在同一個域)就是兩個頁面具有相同的協(xié)議(protocol),主機(host)和端口號(port)
二、什么是跨域?
當一個請求url的協(xié)議、域名、端口三者之間任意一個與當前頁面url不同即為跨域
| 當前頁面url | 被請求頁面url | 是否跨域 | 原因 |
|---|---|---|---|
| https://www.52fansite.com/ | https://www.52fansite.com/index.html | 否 | 同源(協(xié)議、域名、端口號相同) |
| https://www.52fansite.com/ | http://www.52fansite.com/index.html | 是 | 協(xié)議不同(https/http) |
| https://www.52fansite.com/ | https://www.baidu.com/ | 是 | 主域名不同(52fansite/baidu) |
| https://www.52fansite.com/ | https://layui.52fansite.com/ | 是 | 子域名不同(www/layui) |
| https://www.52fansite.com:8080/ | https://www.52fansite.com:8081/ | 是 | 同源(協(xié)議、域名、端口號相同) |
三、處理跨域
1、在controller的類上或方法上添加注解
1.1類上加注解
@RestController
@CrossOrigin(origins = "*")
public class CorsController {
@GetMapping("/cors")
public String testCors() {
return "success";
}
}
1.2方法上加注解
@RestController
public class CorsController {
@CrossOrigin(origins = "*")
@GetMapping("/cors")
public String testCors() {
return "success";
}
}
2、在啟動類配置全局cors(springboot2.0已經(jīng)過時)
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/*").allowedOrigins("*");
}
};
}
}
替換為
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/*").allowedOrigins("*");
}
};
}
}
3、注冊corsFilter
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
以上就是springboot解決前后端分離時的跨域問題的詳細內(nèi)容,更多關(guān)于springboot解決跨域的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java實戰(zhàn)小技巧之字符串與容器互轉(zhuǎn)詳解
Java.lang.String是Java的字符串類. Srting是一個不可變對象,下面這篇文章主要給大家介紹了關(guān)于java實戰(zhàn)小技巧之字符串與容器互轉(zhuǎn)的相關(guān)資料,需要的朋友可以參考下2021-08-08
java 配置MyEclipse Maven環(huán)境具體實現(xiàn)步驟
這篇文章主要介紹了 java 配置MyEclipse Maven環(huán)境具體實現(xiàn)步驟的相關(guān)資料,具有一定的參考價值,需要的朋友可以參考下2016-11-11
Mybatis中的resultType和resultMap使用
這篇文章主要介紹了Mybatis中的resultType和resultMap使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-09-09
詳解application.properties和application.yml文件的區(qū)別
這篇文章主要介紹了詳解application.properties和application.yml文件的區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01

