SpringBoot项目中使用Cros解决跨域问题

  作为一个java后端开发人员,在进行项目开发的时候,一定会进行资源上的交互,久走夜路,必然会遇到跨域访问问题;下面简单了解一下什么是跨域问题。

跨域问题的由来

在这里插入图片描述

  首先跨域源自于浏览器的同源策略,所谓的同源策略即:协议相同、域名相同、端口相同,同源策略是Netscape提出的一个著名的安全策略,出于浏览器访问安全来考虑的,但是我们在实际的项目开发中又有跨域访问资源的需求,此时我们就面临一个问题:跨域访问安全!

浏览器使用同源策略的目的——保护用户隐私

如果不使用同源策略,那我们能干啥?
1.可以获取不同源的不同源的DOM
2.可以获取到不同源的Cookie、LocalStorage、IndexDB
3.可以发送不同源的AJAX请求,且浏览器不会对其进行拦截。

如果不使用同源策略,可能导致的后果?

如果没有同源策略,那么我们可能会被某个恶意网站获取到其他网站的Cookie等信息,如果这些用户隐私被恶意获取,那么导致的后果可能无法估量。

跨域问题解决方案

  通过上面的介绍,我们知道了浏览器的同源策略对于用户隐私保护的重要性,但是如果我们想要进行跨域资源访问也不是没有办法:

JSONP(JSON with Padding,)

  首先jsonp是一个比较传统的前端的跨域问题解决方案,大致的思路就是浏览器不会对script标签的src属性进行跨域访问拦截,JSONP就是利用了这一点,在发起请求的时候,将请求放在src属性中,从而避开浏览器的跨域拦截。
  JSONP有一个很大的缺陷:那就是只支持GET请求,不支持其他类型的请求。

CROS(Cross-Origin Resource Sharing)
  在Springboot项目中,使用Cros来解决浏览器的跨域安全访问是现下一种非常流行的解决方案,而且SpringMvc对于Cros有很好的支撑,有时候一个简单的注解就能轻松解决跨域访问问题。

CROS解决跨域问题案例
1.创建一个Springboot web项目,添加web依赖

在这里插入图片描述
此Cros1项目作为一个Provider来使用
2.Cros1项目中随便写一个Controller类
在这里插入图片描述
3.新建一个Cros2项目,来请求Cros1项目中的资源
Cros2项目中只写一个html页面来发起一个get请求Cros1中的hello接口。

Cros1的端口为:8080,Cros2的端口为8081
在这里插入图片描述
4.分别启动Cros1和Cros2项目,然后从浏览器中访问Cros2项目中的index.html页面。
在这里插入图片描述
5.点击GET,发起get请求。从浏览器的控制台中可以发现报了如下跨域访问错误。
在这里插入图片描述
6.此时到Cros1项目中的controller中添加一个注解,即可解决此问题
在这里插入图片描述
7.以上注解表示此接口允许接受来自http://localhost:8081的访问请求,然后重启Cros1项目,刷新网页,发现能够返回接口数据。
在这里插入图片描述

配置全局跨域访问

  通过上面一个简单的案例发现,实现跨域访问好像也没有进行什么特殊的配置,但是!如果我们在每个接口或者类上面都来这么一个注解,还是会比较费事的。此时我们可以使用@Configuration定义一个配置类:

@Configuration
public class CrosConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:8081")
                .maxAge(300 * 1000)
                .allowedHeaders("*")
                .allowedMethods("*");

    }
}

在这里插入图片描述
定义了以上的配置类之后,我们再将controller接口中的@CrosOrigin(“http://localhost:8081”)去掉,然后重启Cros1项目,再访问Cros2项目(端口8081)中的index.html页面,发送请求发现能够访问8080端口的资源。

在这里插入图片描述

总结:
在本案例中,使用Cros解决跨域访问问题使用到的核心注解就是@CrosOrigin,此注解可以使用在类上,也可以使用在某个单独的方法上,当使用在类名上的时候,表示此类中的方法均接受指定的资源访问请求。

原文地址:https://www.cnblogs.com/wgty/p/12810486.html