SpringBoot解决跨域问题

SpringBoot解决跨域问题

什么是跨域

源(origin)就是协议、域名和端口号。
URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口全部相同,则表示他们同源。否则,只要协议、域名、端口有任何一个不同,就是跨域

对比

URL是否跨域原因
https://www.csdn.com/more/index.html不跨域三要素相同
https://map.csdn.com/more/index.html跨域域名不同
https://www.csdn.com:8999/more/index.html跨域端口不同
http://www.csdn.com/more/index.html跨域协议不同

同源策略

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

同源策略又分为以下两种:

  1. DOM同源策略: 禁止对不同源页面DOM 进行操作。这里主要场景是iframe跨域的情况,不同域名的iframe是限制互相访问的。
  2. XMLHttpRequest同源策略: 禁止使用XHR对象向不同源的服务器地址发起HTTP请求。

如何解决

方案一 配置类解决

创建Config配置类实现WebMvcConfigurer接口
/*
 * 1、addMapping 允许访问路径
 * 2、allowedOrigins 添加跨域请求来源
 * 3、allowedMethods 允许跨域的方法
 * 4、allowCredentials 是否允许携带信息
 * 5、maxAge 最大响应时间
 * 6、allowedHeaders 允许访问请求头
 */
@Configuration
public class CrosConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") 
                .allowedOrigins("*")
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS") 
                .allowCredentials(true) 
                .maxAge(3600)
                .allowedHeaders("*");
    }
}

方案二 添加@CrossOrigin注解

SpringBoot版本为2.X及以上

@RestController
@RequestMapping("/book")
public class BookController {

    @Autowired
    private BookRepository bookRepository;

    /**
     * @CrossOrigin 解决跨域问题
     *  作用范围:类与方法
     *  属性:
     *      origins:允许可访问的与列表 可填多个
     *      maxAge:准备响应前的缓存最大持续时间 默认-1
     * @return
     */
    @CrossOrigin 
    @GetMapping("/findAll")
    public List<Book> findAll() {
        return bookRepository.findAll();
    }
}
工作原理

CORS请求(包括预选的带有选项方法)被自动发送到注册的各种HandlerMapping 。它们处理CORS准备请求并拦截CORS简单和实际请求,这得益于CorsProcessor实现(默认情况下默认DefaultCorsProcessor处理器),以便添加相关的CORS响应头(如Access-Control-Allow-Origin)。 CorsConfiguration 允许您指定CORS请求应该如何处理:允许origins, headers, methods等。

  1. AbstractHandlerMapping#setCorsConfiguration()
    允许指定一个映射,其中有几个CorsConfiguration 映射在路径模式上,比如/api/**。
  2. 子类可以通过重写AbstractHandlerMapping类的getCorsConfiguration(Object, HttpServletRequest)方法来提供自己的CorsConfiguration
  3. 处理程序可以实现
    CorsConfigurationSource接口(如ResourceHttpRequestHandler),以便为每个请求提供一个CorsConfiguration

感谢阅读!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值