zoukankan      html  css  js  c++  java
  • 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,此注解可以使用在类上,也可以使用在某个单独的方法上,当使用在类名上的时候,表示此类中的方法均接受指定的资源访问请求。

  • 相关阅读:
    菜根谭#245
    菜根谭#244
    菜根谭#243
    菜根谭#242
    菜根谭#241
    菜根谭#240
    菜根谭#239
    菜根谭#238
    菜根谭#237
    [转载]Linux 内核list_head 学习(一)
  • 原文地址:https://www.cnblogs.com/wgty/p/12810486.html
Copyright © 2011-2022 走看看