当前位置:   article > 正文

【SpringBoot系列】实现跨域的几种方式_springboot跨域配置

springboot跨域配置

一、什么是跨域

跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,或者涉及到两个不同域名的资源之间的交互。由于同源策略(Same Origin Policy)的限制,浏览器不允许跨域请求。同源策略规定,A网页设置的Cookie、LocalStorage和IndexDB无法被同源以外的网页读取。跨域请求会被浏览器拒绝。举个例子:- DOMAIN-A.com 和 DOMAIN-B.com 是两个不同的域名,它们之间的请求就是跨域请求。- DOMAIN-A.com/dir1 和 DOMAIN-A.com/dir2 虽然路径不同,但是域名相同,所以不是跨域。

二、跨域问题出现的原因

  1. 浏览器的同源策略(Same Origin Policy)限制了跨域请求。主要出于安全考虑,浏览器限制脚本只能读取与之同源的资源。同源指的是协议、域名、端口都相同。跨域请求会因为违反同源策略而被阻止。

  2. Cookie和本地存储也遵循同源策略。A域名下的页面无法读取B域名下的Cookie、localStorage等。

  3. 跨域JavaScript请求会报错。比如A页面请求B页面的JS文件,就会报错。

  4. 跨域DOM无法访问。A页面的JS无法获取B页面的DOM节点。

  5. 跨域数据请求需要进行CORS预检。浏览器会在正式通信之前,先进行一次HTTP查询请求,询问服务器是否允许跨源请求。

  6. iframe也受同源策略限制。A页面的iframe嵌入B页面,A页面JS无法访问iframe的DOM。

  7. 跨域图片获取限制。A页面无法获取B页面img标签的src,会报错。

三、常见的跨域请求方式

  1. JSONP:通过script标签加载JS文件来实现跨域通信。

  2. CORS:服务器端设置HTTP头,允许指定的请求来源跨域访问。

  3. postMessage:A域的window向B域的window发送消息,实现跨域通信。

四、SpringBoot实现跨域的几种方式

1.@crossOrigin 注解我们可以在Controller的方法上直接使用@CrossOrigin注解,如:

  1. @CrossOrigin(origins = "http://domain1.com")
  2. @RestController
  3. public class TestController {
  4.   @GetMapping("/test")
  5.   public String test() {
  6.       return "hello";
  7.   }
  8. }

这种方式简单适用,但是不能应对所有的跨域请求,比较局限。

2.过滤器CorsFilter我们可以注册CorsFilter跨域过滤器,如:

  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.web.cors.CorsConfiguration;
  4. import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
  5. import org.springframework.web.filter.CorsFilter;
  6. @Configuration
  7. public class CorsConfig {
  8. @Bean
  9. public CorsFilter corsFilter() {
  10. UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
  11. CorsConfiguration corsConfiguration = new CorsConfiguration();
  12. corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址
  13. corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头
  14. corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法
  15. //设置预检请求有效期 30min
  16. corsConfiguration.setMaxAge(1800L);
  17. source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置
  18. return new CorsFilter(source);
  19. }
  20. }

然后该过滤器会应用到所有的请求上。这种方式配置更加灵活。

3.配置类WebMvcConfigurer我们可以在WebMvcConfigurer接口的addCorsMappings()方法中添加跨域配置,如:

  1. @Configuration
  2. public class CorsConfig implements WebMvcConfigurer {
  3.   @Override
  4.   public void addCorsMappings(CorsRegistry registry) {
  5.       registry.addMapping("/**")
  6.           .allowedOrigins("http://domain1.com")
  7.           .allowedMethods("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH")
  8.           .allowedHeaders("*")
  9.           .allowCredentials(true);
  10.   }
  11. }

这也是一种比较常用的跨域解决方案。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/458816
推荐阅读
相关标签
  

闽ICP备14008679号