Spring Boot 2.X 如何优雅的解决跨域问题?

本文详细介绍了源(origin)的概念,即协议、域名和端口号的组合,并阐述了同源策略的基本原理及其在浏览器安全中的作用。同时,文章提供了SpringBoot下解决跨域问题的两种方法:使用@CrossOrigin注解和WebMvcConfigurer对象定义全局CORS配置。

源(origin)就是协议、域名和端口号。
URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口全部相同,则表示他们同源。否则,只要协议、域名、端口有任何一个不同,就是跨域。
在这里插入图片描述
二、什么是同源策略?
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

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

DOM同源策略:禁止对不同源页面DOM 进行操作。这里主要场景是iframe跨域的情况,不同域名的iframe是限制互相访问的。
XMLHttpRequest同源策略:禁止使用XHR对象向不同源的服务器地址发起HTTP请求。
三、Spring Boot跨域解决方案
本例使用Spring Boot 2.1.6.RELEASE演示,分别用8080和8081端口启动,部分代码如下:

在Spring Boot 2.X应用程序中可以使用注解@CrossOrigin,也可以通过使用WebMvcConfigurer对象来定义全局CORS配置。

  1. @CrossOrigin注解示例代码
@SpringBootApplication
@RestController
@CrossOrigin
public class VueDomeApplication {
    public static void main(String[] args) {
        SpringApplication.run(VueDomeApplication.class, args);
    }

    @GetMapping("login")
    public User login() {
        User user = new User();
        user.setName("bowen");
        return user;
    }
}
  1. WebMvcConfigurer对象示例代码
@SpringBootApplication
@RestController
/*@CrossOrigin*/
public class VueDomeApplication {

    public static void main(String[] args) {
        SpringApplication.run(VueDomeApplication.class, args);
    }

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/*")
                        .allowedOrigins("*")
                        .allowCredentials(true)
                        .allowedMethods("GET", "POST", "DELETE", "PUT","PATCH")
                        .maxAge(3600);
            }
        };
    }

    @GetMapping("login")
    public User login() {
        User user = new User();
        user.setName("bowen");
        return user;
    }

}
Spring Boot解决问题有多种方式,以下是其中的两种: 1. 使用 @CrossOrigin 注解 在 Spring Boot 的 Controller 层中,可以使用 @CrossOrigin 注解来解决问题。例如: ``` @RestController public class MyController { @CrossOrigin @GetMapping("/hello") public String hello() { return "Hello, world!"; } } ``` 使用 @CrossOrigin 注解可以实现简单的请求,但是如果需要更细粒度的控制,就需要使用其他的方式。 2. 自定义 CorsFilter Spring Boot 中可以自定义 CorsFilter 来处理请求。CorsFilter 是一个过滤器,可以在请求处理之前拦截请求,并进行相应的处理。例如: ``` @Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowedOrigins(Arrays.asList("*")); // 允许所有名 config.setAllowedMethods(Arrays.asList("*")); // 允许所有 HTTP 方法 config.setAllowedHeaders(Arrays.asList("*")); // 允许所有请求头 config.setMaxAge(1800L); // 预检请求的有效期,单位为秒 source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } } ``` 上面的代码中,我们通过 CorsConfiguration 来配置允许的名、HTTP 方法、请求头和预检请求的有效期等信息。然后将这个配置注册到 UrlBasedCorsConfigurationSource 中,并返回一个 CorsFilter 对象,这样就可以处理请求了。 以上两种方式都可以用来解决问题,具体使用哪种方式可以根据实际情况来决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值