目錄
1. 什么是跨域問題 ?
2. Spring MVC 如何解決跨域問題 ?
3. Spring Boot 如何解決跨域問題 ??
1. 什么是跨域問題 ?
跨域問題指的是不同站點之間,使用 ajax 無法相互調(diào)用的問題。
跨域問題的 3 種情況:
1. 協(xié)議不同,例如 http 和 https;
- http://127.0.0.1:8080
- https://127.0.0.1:8080
2. 域名不同;
- 一級域名、二級域名..不同,都算跨域請求
3. 端口不同.
- 80
- 443
為什么要有跨域問題 ?
????????跨域問題本質(zhì)上是瀏覽器的一種保護機制,它誕生的初衷是為了保證用戶的安全,防止惡意網(wǎng)站竊取數(shù)據(jù)。但是這個保護機制也帶來新的問題,它使得不同站點之間的正常調(diào)用,也會遇到阻礙。
2. Spring MVC 如何解決跨域問題 ?
1. 定義一個配置類;
2. 在配置類中寫一個方法,返回 WebMvcConfigurer 對象,并重寫 addCorsMappings 方法。
@Configuration
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 設(shè)置允許跨域的請求規(guī)則【響應(yīng)頭里添加標識】
registry.addMapping("/api/**");
}
};
}
}
????????跨域問題,它的請求可以到達后端,只不過在后端返回響應(yīng)給前端的時候,瀏覽器會做跨域問題的驗證。
為什么不在前端驗證 ?
因為前端代碼是可以修改的,通過開發(fā)者工具都是可以偽造的,所以在前端驗證沒有意義。
3. Spring Boot 如何解決跨域問題 ??
在 Spring Boot 中,解決跨域問題常見的方式有 5 種 :
1. 使用 @CrossOrigin 注解實現(xiàn)跨域;【局部跨域】
2. 通過配置文件實現(xiàn)跨域;【最常見 - 全局跨域】
3. 通過 CorsFilter?對象實現(xiàn)跨域;【全局跨域】
4. 通過 Response 對象實現(xiàn)跨域;【局部跨域】
5. 通過實現(xiàn) ResponseBodyAdvice 實現(xiàn)跨域。【次常見 - 全局跨域】
具體的實現(xiàn)如下:
① 使用 @CorsOrigin 注解實現(xiàn)跨域
????????@CorsOrigin 注解既可以加在類上,又可以加在方法上,修飾類表示這個類種所有接口都可以跨域,修飾方法表示這個方法可以跨域。
@RestController
@CrossOrigin(origins = "*")
public class TestController {
@RequestMapping("/test")
public HashMap<String,Object> test() {
HashMap<String,Object> map = new HashMap<>();
map.put("code",200);
map.put("data","success");
map.put("msg","");
return map;
}
}
這種方式只能實現(xiàn)局部跨域,當(dāng)一個項目中有多個類的時候,使用這種方式就會比較麻煩。
② 通過配置文件實現(xiàn)跨域
- 創(chuàng)建一個新的配置類;
- 添加 @Configuration 注解,實現(xiàn) WebMvcConfigurer 接口;
- 重寫 addCorsMappings 方法,設(shè)置允許跨域。
這種方式可以實現(xiàn)全局跨域,和 Spring MVC 里面一樣:
@Configuration
public class MyConfiguration implements WebMvcConfigurer{
@Override
public void addCorsMappings(CorsRegistry registry) {
// 設(shè)置允許跨域的請求規(guī)則
registry.addMapping("/**")
.allowCredentials(true) // 是否發(fā)送 Cookie
.allowedOriginPatterns("*") // 支持跨域
// 支持方法
.allowedMethods(new String[]{"GET","POST","PUT","DELETE"})
.allowedHeaders("*")
.exposedHeaders("*");
}
}
③?通過 CorsFilter?對象實現(xiàn)跨域
這種方式和方式 ② 類似,只不過此處是通過給方法加上 @Bean 注解,返回一個 CorsFilter 對象
④ 通過 Response 對象實現(xiàn)跨域
這種方式是解決跨域問題最原始的方式,它可以支持所有版本的 Spring Boot,但是這種方式也是局部跨域。
@RestController
public class TestController {
@RequestMapping("/test")
public HashMap<String,Object> test(HttpServletResponse response) {
// 設(shè)置跨域
response.setHeader("Access-Control-Allow-Origin","*");
return new HashMap<String, Object>() {{
put("code",200);
put("data","success");
put("msg","");
}};
}
}
⑤?通過實現(xiàn) ResponseBodyAdvice 實現(xiàn)跨域文章來源:http://www.zghlxwxcb.cn/news/detail-689939.html
????????這個接口可以用于集中統(tǒng)一處理,在統(tǒng)一數(shù)據(jù)返回的時候,我們就可以實現(xiàn)這個接口,在數(shù)據(jù)即將返回給前端的時候,在響應(yīng)頭種加上一個 “我是自己人” 的標識,就可以實現(xiàn)跨域了,這種方式也是全局跨域。文章來源地址http://www.zghlxwxcb.cn/news/detail-689939.html
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
return true; // 返回 true, 才能執(zhí)行后續(xù)方式
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
// 設(shè)置跨域
response.getHeaders().set("Access-Control-Allow-Origin","*");
return body;
}
}
到了這里,關(guān)于什么是跨域問題 ?Spring MVC 如何解決跨域問題 ?Spring Boot 如何解決跨域問題 ?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!