首页 > 其他分享 >SpringBoot解决跨域方案

SpringBoot解决跨域方案

时间:2023-02-23 16:59:06浏览次数:43  
标签:方案 SpringBoot springframework header org import config 跨域

SpringBoot解决跨域的几种方式

跨域资源共享(CORS):通过修改Http协议header的方式,实现跨域。说的简单点就是,通过设置HTTP的响应头信息,告知浏览器哪些情况在不符合同源策略的条件下也可以跨域访问,浏览器通过解析Http协议中的Header执行具体判断。具体的Header如下:

CORS跨域常用header

  • Access-Control-Allow-Origin: 允许哪些ip或域名可以跨域访问

  • Access-Control-Max-Age: 表示在多少秒之内不需要重复校验该请求的跨域访问权限

  • Access-Control-Allow-Methods: 表示允许跨域请求的HTTP方法,如:GET,POST,PUT,DELETE

  • Access-Control-Allow-Headers: 表示访问请求中允许携带哪些Header信息,如:Accept、Accept-Language、Content-Language、Content-Type

1、使用CorsFilter进行全局跨域配置【推荐】

import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.http.HttpMethod;  
import org.springframework.web.cors.CorsConfiguration;  
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;  
import org.springframework.web.filter.CorsFilter;  
import org.springframework.web.servlet.config.annotation.CorsRegistry;  
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**

- TODO 全局跨域处理
  

- @author ss_419
  
- @version 1.0
  
- @date 2023/2/23 16:20  
  */@Configuration  
  public class GlobalCorsConfig {  
   @Bean  
   public CorsFilter corsFilter() {
  

   CorsConfiguration config = new CorsConfiguration();  
   // 开放那些IP、端口、域名的访问权限,"*" 表示开放所有域  
   config.addAllowedOrigin("*");  
   // 是否发送Cookie信息  
   config.setAllowCredentials(true);  
   // 允许的请求方式  
   config.addAllowedMethod(HttpMethod.GET);  
   config.addAllowedMethod(HttpMethod.POST);  
   config.addAllowedMethod(HttpMethod.PUT);  
   config.addAllowedMethod(HttpMethod.DELETE);  
   // 允许HTTP请求中携带那些Header信息  
   config.addAllowedHeader("*");  

  
  // config.addExposedHeader("*");

   // 添加映射路径,"/**"  表示对所有的路径实行全局跨域访问权限的设置  
   UrlBasedCorsConfigurationSource configurationSource = new UrlBasedCorsConfigurationSource();  
   configurationSource.registerCorsConfiguration("/**", config);  
  
   return new CorsFilter(configurationSource);  

  
  }
}

2、 重写WebMvcConfigurer的addCorsMappings方法(全局跨域配置)【推荐】


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * TODO 全局跨域处理
 *
 * @author ss_419
 * @version 1.0
 * @date 2023/2/23 16:20
 */
@Configuration
public class GlobalCorsConfig {
   

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")// 添加映射路径,"/**"表示对所有的路径进行全局跨域访问权限的设置
                        .allowedOrigins("*")// 开放那些ip、端口、域名的访问权限
                        .allowCredentials(true)// 是否允许发送Cookie信息
                        .allowedMethods("*")// 开放那些HTTP方法,允许跨域访问
                        .allowedHeaders("*")// 允许HTTP请求中携带那些Header信息
//                        .exposedHeaders("*")// 暴露那些头部信息(因为跨域访问默认不能获取全部头部信息)
                        .maxAge(3600);// 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了

            }
        };
    }
}

3、使用CrossOrigin注解(局部跨域配置)

将CrossOrigin注解加在Controller层的方法上,该方法定义的RequestMapping端点将支持跨域访问
将CrossOrigin注解加在Controller层的类定义处,整个类所有的方法对应的RequestMapping端点都将支持跨域访问

@RequestMapping("/cors")
@ResponseBody
@CrossOrigin(origins = "http://localhost:8080", maxAge = 3600) 
public String cors( ){
 return "cors";
}

4、使用HttpServletResponse设置响应头(局部跨域配置)

@RequestMapping("/cors")
@ResponseBody
public String cors(HttpServletResponse response){
    //使用HttpServletResponse定义HTTP请求头,最原始的方法也是最通用的方法
    response.addHeader("Access-Control-Allow-Origin", "http://localhost:8080");
    return "cors";
}

5、通过nginx解决

location ~ /quartz/ {
            proxy_pass http://192.168.X.XXX:9830;
            proxy_read_timeout 360s;
            proxy_send_timeout 360s;
            proxy_set_header Host $http_host; 
            proxy_set_header X-Real-IP $remote_addr; 
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            add_header Front-End-Https on;
            add_header 'Access-Control-Allow-Methods' 'GET,POST';
            add_header 'Access-Control-Allow-Origin' $http_origin;
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With';
            }
        }

标签:方案,SpringBoot,springframework,header,org,import,config,跨域
From: https://www.cnblogs.com/atwood-pan/p/17148659.html

相关文章

  • 115、商城业务---分布式事务---使用Springboot提供的Seata解决分布式事务
    https://seata.io/zh-cn/seata使用SeataAT模式控制分布式事务的步骤:1、每一个想控制分布式事务的服务对应的数据库都需要创建一个UNDO_LOG表CREATETABLE`undo_log`......
  • Springboot 集成 Fastjson2
    Springboot整合Fastjson2排除默认的Jackson<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>......
  • 安装 conda 后的部分问题解决方案
    WindowsPowerShell无法使用Conda虚拟环境Anaconda和Miniconda均适用。打开环境变量,选中用户变量(或者系统变量也可以)中的Path,点击编辑。将如下conda安......
  • 软件开发代码防泄密管理方案
    1、概述通过创建代码存储、流转、使用的安全区/加密子网,在底层彻底安全隔离基础上,实现对内部软件开发代码的安全管理,防止其向外泄露、扩散。 2、步骤1)通过数据安全隔离技术......
  • SpringBoot21 - 数据层解决方案 SQL
    数据层解决方案-SQL​ SSMP整合的时候数据层解决方案涉及到了哪些技术?MySQL数据库与MyBatisPlus框架,后面又学了Druid数据源的配置,所以现在数据层解决方案可以说是Mysql......
  • SpringBoot20 - 测试
    测试​ 测试是保障程序正确性的唯一屏障,在企业级开发中更是不可缺少,但是由于测试代码往往不产生实际效益,所以一些小型公司并不是很关注,导致一些开发者从小型公司进入中大......
  • JPA在SpringBoot中简单使用
    前言在SpringBoot项目中可以与JPA进行搭配,这样会省很多的开发时间,以下为JPA的简单使用一、导入依赖<!--springbootjpa依赖--><dependency><groupId>org.spring......
  • SpringBoot17 - 常用计量单位绑定
    常用计量单位绑定​ 在前面的配置中,我们书写了如下配置值,其中第三项超时时间timeout描述了服务器操作超时时间,当前值是-1表示永不超时。servers:ip-address:192.168......
  • SpringBoot18 - 校验
    校验​ 在书写时由于无法感知模型类中的数据类型,就会出现类型不匹配的问题,比如代码中需要int类型,配置中给了非法的数值,例如写一个“a",这种数据肯定无法有效的绑定,还会引......
  • SpringBoot19 - 数据类型转换
    数据类型转换​ 先把问题描述一下,这位开发者连接数据库正常操作,但是运行程序后显示的信息是密码错误。java.sql.SQLException:Accessdeniedforuser'root'@'localho......