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解决跨域方案的更多相关文章

  1. SpringBoot解决跨域请求拦截

    前言 同源策略:判断是否是同源的,主要看这三点,协议,ip,端口. 同源策略就是浏览器出于网站安全性的考虑,限制不同源之间的资源相互访问的一种政策. 比如在域名https://www.baidu.co ...

  2. springboot解决跨域问题(Cors)

    1.对于前后端分离的项目来说,如果前端项目与后端项目部署在两个不同的域下,那么势必会引起跨域问题的出现. 针对跨域问题,我们可能第一个想到的解决方案就是jsonp,并且以前处理跨域问题我基本也是这么处 ...

  3. Springboot第二篇:与前端fetch通信(附springboot解决跨域方法)

    说到与前端通信,明白人都知道这章肯定会写两部分的东西啦. 关于后台 ①首先回顾前文,上一章环境搭建如图: ②我们在maven.example.controller下添加一个文件,并附上如图代码: ③: ...

  4. springboot解决跨域问题

    在启动类里加入corsFilter import org.springframework.boot.SpringApplication; import org.springframework.boot ...

  5. JSONP解决跨域方案

    一.jsonp原理 本质并不是ajax,只是执行了跨域js,所以该方式只支持get方式 html中,所有带src属性的标签都可以跨域script img iframe 所以,可以通过script加载其 ...

  6. Springboot 解决跨域请求

    Cors处理 跨域请求 细粒度 直接在controller层上 添加@CrossOrigin注解 @PostMapping("/") @CrossOrigin(value = &q ...

  7. Asp.Net WebApi服务端解决跨域方案

    1.特性方式 主要是继承ActionFilterAttribute,重写OnActionExecuted方法,在action执行后,给响应头加上一个键值对. using System.Web.Http ...

  8. springboot解决跨域

    @Configuration public class WebMvcConfiguration implements WebMvcConfigurer { @Bean public CorsFilte ...

  9. SpringBoot 解决跨域问题代码

    package com.example.demo.gs; import org.springframework.context.annotation.Configuration; import jav ...

  10. SpringBoot系列(八)分分钟学会Springboot多种解决跨域方式

    SpringBoot系列(八) 分分钟学会SpringBoot多种跨域解决方式 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 s ...

随机推荐

  1. Tplmap-20220206

    Usage: python tplmap.py [options] 选项: -h, --help 显示帮助并退出 目标: -u URL, --url=URL 目标 URL -X REQUEST, -- ...

  2. 20202411 2020-2021-2 《Python程序设计》实验三报告

    20202411 2020-2021-2 <Python程序设计>实验三报告 课程:<Python程序设计> 班级: 2024 姓名: 陈书桓 学号:20202411 实验教师 ...

  3. 第一讲:selenium快速入门

    一.selenium目前住主流的web自动化测试框架: 1.资料丰富 资料丰富       2.测试岗位招聘要求,上板率非常之高       3.支持多语言(iava/ pythan/ go /js) ...

  4. 给linux串口,增加登录密码

    一.密码更改 1.在linux系统上,输入passwd,输入需要设定的密码,密码文件保存在/etc/passwd里面. 2.把/etc/passwd文件拷贝出来,放到rootfs的etc/目录下,实现 ...

  5. VUE安装环境及项目创建

    Vue环境安装配置 安装git工具,便于在wind电脑上操作命令行,自行在网上下载安装,(可以不安装)使用cmd. 安装node,检查node安装是否成功,在git工具中输入node -v(如果成功的 ...

  6. 六、js创建页码器:分页、上一页下一页、省略页码

    表格数据太多,需要做成分页.因此需要写一个页码器. 1,初始化页码 获取数据之后渲染页码器,页码器初始化,小于6页的全部展示,否则展示前四页,后面是省略号,最后展示尾页.默认选中第一页,禁用前一页的箭 ...

  7. LOJ数列分块入门九题(上)

    一转眼,已经有整整一年没有在博客园写博客了.去洛谷写了几篇(How time flys. 最近突然想起其实我不太擅长分块算法,又想起去年暑假有位同学同我提起过LOJ的数列分块九题,说来惭愧,打了这么久 ...

  8. C++从键盘读取一行的方法

    从键盘读取一行的方法 cin类中的成员函数getline()和get()--使用数组来处理字符串 cin.getline(数组,要读入的字符数).getline()将丢弃换行符.这个成员函数通过换行符 ...

  9. 实验二 实验二 Linux系统简单文件操作命令

    项目 内容 这个作业属于哪个课程 <班级课程的主页链接> 这个作业的要求在哪里 <作业要求链接接地址> 学号-姓名 15043109吴小怀 作业学习目标 学习在Linux系统终 ...

  10. 3html5

    <label>网址:</label><input type="url" name="" required><br> ...