配置Cross-Origin的几种方法

Cross-origin resource sharing (CORS)

参考文档: Spring Boot

Cross-origin resource sharing (CORS) is a W3C specification implemented by most browsers that lets you specify in a flexible way what kind of cross-domain requests are authorized., instead of using some less secure and less powerful approaches such as IFRAME or JSONP.

As of version 4.2, Spring MVC supports CORS. Using controller method CORS configuration with @CrossOrigin annotations in your Spring Boot application does not require any specific configuration. Global CORS configuration can be defined by registering a WebMvcConfigurer bean with a customized addCorsMappings(CorsRegistry) method, as shown in the following example:

@Configuration(proxyBeanMethods = false)
public class MyConfiguration {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/api/**");
            }
        };
    }
}

配置Cross-Origin的几种方法

参考文档:Spring MVC

1 注解法 @CrossOrigin

  • 可在类级别使用,方法级别可以继承(覆盖)
  • 默认值
    • Allow all origins.
    • Allow all headers.
    • All HTTP methods to which the controller method is mapped.
    • allowedCredentials is not enabled by default
    • Set max age to 1800 seconds (30 minutes).
  • 用于细粒度的控制
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin("https://domain2.com")
    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @DeleteMapping("/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

2 全局配置法 (Global Configuration)

  • 默认值,详见 org.springframework.web.cors.CorsConfiguration#applyPermitDefaultValues()
    • Allow all origins.
    • Allow all headers.
    • GET, HEAD, and POST methods.(注意:这个和注解不一样)
    • allowedCredentials is not enabled by default
    • Set max age to 1800 seconds (30 minutes).
  • 一般放到 MVC Java configuration(WebMvcConfigurer的实现类)中
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("*")
                .allowedHeaders("*")
                .allowedMethods("GET", "HEAD", "POST")
                .allowCredentials(false)
                .maxAge(3600);

        // Add more mappings...
    }
}
  • 搞个单独的Configuration也是可以的
@Configuration(proxyBeanMethods = false)
public class CorsConfig {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/api/**")
                        .allowedOrigins("*")
                        .allowedHeaders("*")
                        .allowCredentials(false)
                        .maxAge(3600);
            }
        };
    }

}

3 过滤器法(CorsFilter)

3.1 没有使用 Spring security 的情况下

@Configuration(proxyBeanMethods = false)
public class CorsConfig {

    /**
     * @see CorsConfiguration#applyPermitDefaultValues()
     * <ul>
     * <li>Allow all origins.</li>
     * <li>Allow "simple" methods {@code GET}, {@code HEAD} and {@code POST}.</li>
     * <li>Allow all headers.</li>
     * <li>Set max age to 1800 seconds (30 minutes).</li>
     * </ul>
     */
    @Bean
    public FilterRegistrationBean corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.applyPermitDefaultValues(); // 注意这个简便用法
        config.setAllowedMethods(Collections.unmodifiableList(Arrays.asList("*")));

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
        bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return bean;
    }

3.2 Spring security 内置了对 CorsFilter 的支持

Spring Security

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

   @Override
   protected void configure(HttpSecurity http) throws Exception {
       http
           // by default uses a Bean by the name of corsConfigurationSource
           .cors(withDefaults())
           //...
   }

   @Bean
   CorsConfigurationSource corsConfigurationSource() {
       CorsConfiguration config = new CorsConfiguration();
       config.applyPermitDefaultValues();
       config.setAllowedMethods(Collections.unmodifiableList(Arrays.asList("*")));

       UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
       source.registerCorsConfiguration("/**", config);
       return source;
   }
}

注意一点,不要重复指定:If you are using Spring MVC’s CORS support, you can omit specifying the CorsConfigurationSource and Spring Security will leverage the CORS configuration provided to Spring MVC.

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Chrome的strict-origin-when-cross-origin是一种浏览器政策,用于处理跨域请求。当在一个网站上发起一个跨域请求时,Chrome会将请求的头部中的Referer字段设置为"strict-origin-when-cross-origin",表示只有在同一站点内的请求才能够访问响应。这意味着,如果你在使用Vue前端部署到Nginx的服务器上时,浏览器访问资源时会产生跨域问题,你可能会在控制台看到strict-origin-when-cross-origin的错误。 为了解决这个问题,你可以通过以下几种方法进行修复: 1. 在谷歌浏览器中输入"chrome://flags/#block-insecure-private-network-requests",然后将"Block insecure private network requests"这个选项设置为"Disabled"。这样做可以禁用跨域请求的限制,但需要注意,这可能会带来一些安全风险。 2. 如果你在配置中没有问题,可以尝试直接在地址栏中输入请求的URL进行访问。如果你能够成功获取到数据,那么问题可能是浏览器相关的。 综上所述,通过禁用Chrome的跨域限制或者尝试直接在地址栏输入URL进行访问,你应该能够解决strict-origin-when-cross-origin的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [谷歌浏览器strict-origin-when-cross-origin 解决](https://blog.csdn.net/weixin_48687496/article/details/123749167)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值