Spring實(shí)現(xiàn)跨域的幾種方式小結(jié)
1.同源策略
所謂同源(即指在同一個(gè)域)就是兩個(gè)頁面具有相同的協(xié)議(protocol),主機(jī)(host)和端口號(hào)(port)
2.什么是跨域
既然都知道什么是同源策略,那說穿了,只要協(xié)議,主機(jī),端口號(hào)有一個(gè)不同就跨域唄。

3.后端實(shí)現(xiàn)跨域的幾種方法
返回新的CorsFilter
重寫 WebMvcConfigurer
使用注解 @CrossOrigin
手動(dòng)設(shè)置響應(yīng)頭 (HttpServletResponse)
自定web filter 實(shí)現(xiàn)跨域 注意:
- CorFilter / WebMvConfigurer / @CrossOriginspringBoot 1.3以后才支持的。
- 上面前兩種方式屬于全局 CORS 配置,后兩種屬于局部 CORS配置。如果使用了局部跨域是會(huì)覆蓋全局跨域。正常人都用局部跨域吧?
- 其實(shí)無論哪種方案,最終目的都是修改響應(yīng)頭,向響應(yīng)頭中添加瀏覽器所要求的數(shù)據(jù),進(jìn)而實(shí)現(xiàn)跨域。
1.返回新的 CorsFilter(全局跨域)(基于過濾器)
CorsFilter 是 Spring 框架提供的一個(gè)用于處理跨域的過濾器,注意了,人家是屬于spring的,不是JDK的,不要瞎搞關(guān)系
// 原CORSFilter
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
// 允許cookies跨域
config.setAllowCredentials(true);
// #允許向該服務(wù)器提交請(qǐng)求的URI,*表示全部允許,自定義可以添加多個(gè),在SpringMVC中,如果設(shè)成*,會(huì)自動(dòng)轉(zhuǎn)成當(dāng)前請(qǐng)求頭中的Origin
config.addAllowedOrigin("*");
// #允許訪問的頭信息,*表示全部,可以添加多個(gè)
config.addAllowedHeader("*");
// 預(yù)檢請(qǐng)求的緩存時(shí)間(秒),即在這個(gè)時(shí)間段里,對(duì)于相同的跨域請(qǐng)求不會(huì)再預(yù)檢了
config.setMaxAge(1800L);
// 允許提交請(qǐng)求的方法,*表示全部允許,一般OPTIONS,GET,POST三個(gè)夠了
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
//對(duì)所有接口都有效
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}2.重寫 WebMvcConfigurer我們現(xiàn)在需要對(duì)請(qǐng)求路徑進(jìn)行攔截,要實(shí)現(xiàn)這個(gè)需求就要添加攔截器(基于攔截器)
在Spring Boot 1.5版本都是靠重寫WebMvcConfigurerAdapter的方法來添加自定義攔截器,消息轉(zhuǎn)換器等。SpringBoot 2.0 后,該類被標(biāo)記為@Deprecated(棄用)
3.使用注解 @CrossOrigin
在控制器(類上)上使用注解 @CrossOrigin:表示該類的所有方法允許跨域 在方法上使用注解 @CrossOrigin:
原理:當(dāng)我們使用@CrossOrigin注解時(shí),程序在底層添加了一個(gè)攔截器來修改response的headers屬性,從而解決跨域問題

4.手動(dòng)設(shè)置響應(yīng)頭 (HttpServletResponse)
@RequestMapping("/index")
public String index(HttpServletResponse response) {
response.addHeader("Access-Allow-Control-Origin","*");
return "index";
}有點(diǎn)抖機(jī)靈
5.自定web filter 實(shí)現(xiàn)跨域
package com.mesnac.aop;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
@Component
public class MyCorsFilter implements Filter {
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-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");
chain.doFilter(req, res);
}
public void init(FilterConfig filterConfig) {}
public void destroy() {}
}到此這篇關(guān)于Spring實(shí)現(xiàn)跨域的幾種方式小結(jié)的文章就介紹到這了,更多相關(guān)Spring實(shí)現(xiàn)跨域內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot中添加靜態(tài)頁面的三種實(shí)現(xiàn)方案與對(duì)比
這篇文章主要為大家詳細(xì)介紹了springboot中添加靜態(tài)頁面的三種實(shí)現(xiàn)方案與對(duì)比,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-11-11
IDEA2023版本創(chuàng)建Spring項(xiàng)目只能勾選17和21卻無法使用Java8的完美解決方案
想創(chuàng)建一個(gè)springboot的項(xiàng)目,本地安裝的是1.8,但是在使用Spring Initializr創(chuàng)建項(xiàng)目時(shí),發(fā)現(xiàn)版本只有17和21,這篇文章主要介紹了IDEA2023版本創(chuàng)建Sping項(xiàng)目只能勾選17和21,卻無法使用Java8的解決方法,需要的朋友可以參考下2023-12-12
Java生成10個(gè)1000以內(nèi)的隨機(jī)數(shù)并用消息框顯示數(shù)組內(nèi)容然后求和輸出
這篇文章主要介紹了Java生成10個(gè)1000以內(nèi)的隨機(jī)數(shù)并用消息框顯示數(shù)組內(nèi)容然后求和輸出,需要的朋友可以參考下2015-10-10
Springboot實(shí)現(xiàn)高吞吐量異步處理詳解(適用于高并發(fā)場(chǎng)景)
這篇文章主要介紹了Springboot實(shí)現(xiàn)高吞吐量異步處理詳解(適用于高并發(fā)場(chǎng)景),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Spring?Boot整合Bootstrap的超詳細(xì)步驟
之前做前端開發(fā),在使用bootstrap的時(shí)候都是去官網(wǎng)下載,然后放到項(xiàng)目中,在頁面引用,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot整合Bootstrap的超詳細(xì)步驟,需要的朋友可以參考下2023-05-05
利用json2POJO with Lombok 插件自動(dòng)生成java類的操作
這篇文章主要介紹了利用json2POJO with Lombok 插件自動(dòng)生成java類的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Spring動(dòng)態(tài)代理實(shí)現(xiàn)日志功能詳解
這篇文章主要為大家詳細(xì)介紹了Spring動(dòng)態(tài)代理實(shí)現(xiàn)日志功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Spring Cloud Gateway層限流實(shí)現(xiàn)過程
這篇文章主要介紹了Spring Cloud Gateway層限流實(shí)現(xiàn)過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08

