SpringBoot后端解决跨域问题的3种方案分享

 更新时间:2023年07月12日 16:22:51   作者:Leon_coding  
这篇文章主要给大家分享介绍了关于SpringBoot后端解决跨域问题的3种方案,跨域指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略造成的,是浏览器施加的安全限制,需要的朋友可以参考下

1.跨域的介绍

跨源资源共享(CORS——Cross-Origin Resource Sharing,跨源资源共享,或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其它源(域、协议或端口),使得浏览器允许这些源访问加载自己的资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器发起一个到服务器托管的跨源资源的“预检”请求。在预检中,浏览器发送的头中标示有 HTTP 方法和真实请求中会用到的头。

2.跨域产生原因

跨域问题所产生的原因是浏览器的“同源策略”所导致的。什么是同源策略呢,就是浏览器规定了,我当前页面和请求页面的 1网络协议、2主机域名、3端口,这三部分必须保证一模一样才行。如下图:

这也主要是浏览器为了保证用户上网的基本安全需求而设置的。

1.为了防止恶意网页可以获取其他网站的本地数据。

2.为了防止恶意网站iframe其他网站的时候,获取数据。

3.为了防止恶意网站在自已网站有访问其他网站的权利,以免通过cookie免登,拿到数据。

3.跨域的解决方案

跨域的解决方案有很多种,前后端都有。这里主要介绍下我所知道的三种方案,并配以代码展示。

1.在后端被访问代码的方法上加注解@CrossOrign。这个注解是spring-web中的注解,我们只需在方法上面加注之后,就会解决CORS问题。例如:

/**
     * 获取用户信息
     * 
     * @return 用户信息
     */
    @GetMapping("getInfo")
    @CrossOrigin
    public AjaxResult getInfo()
    {
        SysUser user = SecurityUtils.getLoginUser().getUser();
        // 角色集合
        Set<String> roles = permissionService.getRolePermission(user);
        // 权限集合
        Set<String> permissions = permissionService.getMenuPermission(user);
        AjaxResult ajax = AjaxResult.success();
        ajax.put("user", user);
        ajax.put("roles", roles);
        ajax.put("permissions", permissions);
        return ajax;
    }

但是,后端有很多被访问的方法,我们不能在每个方法上面都加上这个注解,代码冗余。所以就有了第二种方法,我们可以添加一个过滤器,来解决CORS问题,代码如下:

 
@Configuration
public class CORSFilter {
    @Bean
    public CorsFilter corsFilter(){
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedMethod("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**",corsConfiguration);
        return new CorsFilter(source);
    }
}

还有一种解决方法,我们可以通过实现接口并重写方法来解决跨域问题,代码如下:

@Configuration
public class CORSConfiguration implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOriginPatterns("*")
                .allowedMethods("GET","POST","PUT","HEAD")
                .allowCredentials(true)
                .allowedHeaders("*")
                .maxAge(3600);
    }
}

通过这三种方式,我们就可以解决CORS跨域问题。

总结

到此这篇关于SpringBoot后端解决跨域问题的3种方案的文章就介绍到这了,更多相关后端跨域问题解决内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringCloud之@FeignClient()注解的使用详解

    SpringCloud之@FeignClient()注解的使用详解

    @FeignClient是SpringCloud中用于声明一个Feign客户端的注解,用于解决模块方法互相调用的问题,Feign是一个声明式的WebService客户端,通过Feign,只需要创建一个接口,并使用注解来描述请求,就可以直接执行HTTP请求了
    2024-11-11
  • MyBatis 超详细讲解动态SQL的实现

    MyBatis 超详细讲解动态SQL的实现

    动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦
    2022-03-03
  • Spring如何使用三级缓存解决循环依赖

    Spring如何使用三级缓存解决循环依赖

    在Spring框架中,循环依赖是指两个或多个Bean相互依赖,形成闭环,导致无法完成初始化,此问题仅存在于单例Bean中,而原型Bean会抛出异常,Spring通过三级缓存及提前暴露策略解决循环依赖:一级缓存存放完全初始化的Bean
    2024-11-11
  • 浅谈SpringCloud的微服务架构组件

    浅谈SpringCloud的微服务架构组件

    这篇文章主要介绍了浅谈SpringCloud的微服务架构组件,Spring Cloud根据分布式服务协调治理的需求成立了许多子项目,每个项目通过特定的组件去实现,需要的朋友可以参考下
    2023-04-04
  • Java中2个Integer比较相同的四种方式举例

    Java中2个Integer比较相同的四种方式举例

    这篇文章主要介绍了Java中比较两个Integer对象的四种方式,并解释了每种方式的原理和适用范围,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • SpringBoot和Vue项目服务器发布流程分享

    SpringBoot和Vue项目服务器发布流程分享

    本文详细介绍了如何将SpringBoot和Vue项目发布到阿里云ECS服务器上的步骤,包括准备服务器、安装宝塔、配置数据库、打包项目、上传文件、设置端口、安装软件和注册网站等
    2025-02-02
  • RocketMQ之Consumer整体介绍启动源码分析

    RocketMQ之Consumer整体介绍启动源码分析

    这篇文章主要为大家介绍了RocketMQ源码分析之Consumer整体介绍启动分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Spring Boot应用开发初探与实例讲解

    Spring Boot应用开发初探与实例讲解

    这篇文章主要介绍了Spring Boot应用开发初探与实例讲解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Jmeter调用java脚本过程详解

    Jmeter调用java脚本过程详解

    这篇文章主要介绍了Jmeter调用java脚本过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • SpringBoot中的声明式事务详解

    SpringBoot中的声明式事务详解

    这篇文章主要介绍了SpringBoot中的声明式事务详解,Spring采用统一的机制来处理不同的数据访问技术的事务, Spring的事务提供一个PlatformTransactionManager的接口,不同的数据访问技术使用不同的接口实现,需要的朋友可以参考下
    2023-08-08

最新评论