Spring Boot 中如何解决跨域问题 ?

现在,因为项目中需要前后端分离部署,所以需要解决跨域的问题。

很多人对跨域有一种误解,以为这是前端的事,和后端没关系,其实不是这样的。

跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,无法发送其他类型的请求,在 RESTful 风格的应用中,就显得非常鸡肋。

因此,从代码规范性,安全性,复杂度来讲,我们推荐在后端通过 (CORS,Cross-origin resource sharing) 来解决跨域问题。

说到跨域,我们有必要先说说浏览器的“同源策略”问题,这是跨越问题产生的根源。

1、同源策略

所谓同源,是指协议、域名以及端口要相同。

同源策略是由Netscape提出的一个著名的安全策略,它是浏览器最核心也最基本的安全功能,现在所有支持JavaScript的浏览器都会使用这个策略。

同源策略是基于安全方面的考虑提出来的,这个策略本身没问题,但是我们在实际开发中,由于各种原因又经常有跨域的需求。传统的跨域方案是JSONP,JSONP虽然能解决跨域但是有一个很大的局限性,那就是只支持GET请求,不支持其他类型的请求。而今天我们说的CORS(跨域源资源共享)(CORS,Cross-origin resource sharing)是一个W3C标准,它是一份浏览器技术的规范,提供了Web服务从不同网域传来沙盒脚本的方法,以避开浏览器的同源策略,这是JSONP模式的现代版。

2、CORS解决方案

在Spring框架中,对于CORS也提供了相应的解决方案,今天我们就来看看SpringBoot中如何实现CORS。

这种解决方案并非 Spring Boot 特有的,在传统的 SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML 文件中配置 CORS ,现在可以通过实现WebMvcConfigurer接口,然后重写addCorsMappings方法解决跨域问题

@Configuration
public class CorsConfig implements WebMvcConfigurer {

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

}

我们使用cookie存放用户登录的信息,在spring拦截器进行权限控制,当权限不符合时,直接返回给用户固定的json结果。

当用户登录以后,正常使用;当用户退出登录状态时或者token过期时,由于拦截器和跨域的顺序有问题,出现了跨域的现象。

我们知道:一个http请求,先走filter,到达servlet后才进行拦截器的处理,如果我们把cors放在filter里,就可以优先于权限拦截器执行

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }

}

3、总结

  • “同源策略”是跨越问题产生的根源;

  • 因为项目中需要前后端分离部署,所以需要解决跨域的问题;

  • Spring Boot 通过实现WebMvcConfigurer接口,然后重写addCorsMappings方法解决跨域问题;

  • 一个http请求,先走filter,到达servlet后才进行拦截器的处理,如果我们把cors放在filter里,就可以优先于权限拦截器执行。

少侠请留步 ... ヾ(◍°∇°◍)ノ゙ ... 
欢迎点赞、评论、加关注,让更多人看到学到赚到
更多精彩,请关注我的"今日头条号":Java云笔记

发布了171 篇原创文章 · 获赞 311 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/weixin_44259720/article/details/104900530
今日推荐