跨域资源共享(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进行全局跨域配置

2. 重写WebMvcConfigurer的addCorsMappings方法(全局跨域配置)

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

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


springboot项目实现cors的四种方式

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;/*** @author xiaomifeng1010* @version 1.0* @date: 2022/4/6 11:37* @Description 全局跨域处理*/
@Configuration
public class GlobalCorsConfigure {@Beanpublic CorsFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();//开放哪些ip、端口、域名的访问权限,星号表示开放所有域config.addAllowedOrigin("*");//是否允许发送Cookie信息config.setAllowCredentials(true);//开放哪些Http方法,允许跨域访问config.addAllowedMethod(HttpMethod.GET);config.addAllowedMethod(HttpMethod.POST);config.addAllowedMethod(HttpMethod.PUT);config.addAllowedMethod(HttpMethod.DELETE);//允许HTTP请求中的携带哪些Header信息config.addAllowedHeader("*");//暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)config.addExposedHeader("*");//添加映射路径,“/**”表示对所有的路径实行全局跨域访问权限的设置UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();configSource.registerCorsConfiguration("/**", config);return new CorsFilter(configSource);}
}

2. 重写WebMvcConfigurer的addCorsMappings方法(全局跨域配置)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** @author xiaomifeng1010* @version 1.0* @date: 2022/4/6 11:37* @Description 全局跨域处理*/
@Configuration
public class GlobalCorsConfigure {@Beanpublic WebMvcConfigurer corsConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**")    //添加映射路径,“/**”表示对所有的路径实行全局跨域访问权限的设置.allowedOrigins("*")    //开放哪些ip、端口、域名的访问权限.allowCredentials(true)  //是否允许发送Cookie信息.allowedMethods("GET","POST", "PUT", "DELETE")     //开放哪些Http方法,允许跨域访问.allowedHeaders("*")     //允许HTTP请求中的携带哪些Header信息.exposedHeaders("*");   //暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)}};}
}

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设置响应头(局部跨域配置)

这种方式略显麻烦,不建议在SpringBoot项目中使用。

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

注意事项,如果你的项目中使用了某个独立的认证框架,那么springboot中提供的跨域配置可能会不生效,例如使用sa-token这个授权认证的框架后,解决跨域问题的话,亲测直接使用上边前三种方法是不生效的,因此,需要使用sa-token中提供的过滤器进行配置

如下:

import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.filter.SaServletFilter;
import cn.dev33.satoken.jwt.StpLogicJwtForStyle;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author xiaomifeng1010* @version 1.0* @date: 2022/4/1 10:51* @Description*/
@Configuration
@Slf4j
public class SaTokenConfigure {/*** @description: Sa-Token 整合jwt(Style模式)* @author: xiaomifeng1010* @date: 2022/4/1* @param* @return: StpLogic**/@Beanpublic StpLogic getStpLogicJwt() {return new StpLogicJwtForStyle();}/*** @description: 注册 Sa-Token全局过滤器* @author: xiaomifeng1010* @date: 2022/4/1* @param* @return: SaServletFilter**/@Beanpublic SaServletFilter getSaServletFilter() {return new SaServletFilter()// 指定 拦截路由 与 放行路由.addInclude("/**").addExclude("/favicon.ico")// 认证函数: 每次请求执行.setAuth(obj -> {log.info("---------- 进入Sa-Token全局认证 -----------");// 登录认证 -- 拦截所有路由,并排除/user/doLogin和获取验证码的接口 用于开放登录SaRouter.match("/h5/**").notMatch("/h5/getCaptcha","/h5/login").check(() -> StpUtil.checkLogin());})// 异常处理函数:每次认证函数发生异常时执行此函数.setError(e -> {log.error("---------- 进入Sa-Token异常处理 -----------");log.error(e.getMessage());return SaResult.error(e.getMessage());})// 前置函数:在每次认证函数之前执行.setBeforeAuth(r -> {// 设置一些安全响应头SaHolder.getResponse()// 服务器名称.setServer("sa-server")// 允许指定域访问跨域资源.setHeader("Access-Control-Allow-Origin", "*")// 允许所有请求方式.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE")// 有效时间.setHeader("Access-Control-Max-Age", "3600")// 允许的header参数.setHeader("Access-Control-Allow-Headers", "*")// 是否可以在iframe显示视图: DENY=不可以 | SAMEORIGIN=同域下可以 | ALLOW-FROM uri=指定域名下可以
//                            .setHeader("X-Frame-Options", "SAMEORIGIN")// 是否启用浏览器默认XSS防护: 0=禁用 | 1=启用 | 1; mode=block 启用, 并在检查到XSS攻击时,停止渲染页面.setHeader("X-XSS-Protection", "1; mode=block")// 禁用浏览器内容嗅探.setHeader("X-Content-Type-Options", "nosniff");});}
}

在这个配置类中也有一个注意事项:就是异常处理时,不要使用你在项目中自定义的 统一响应封装对象,需要使用sa-token中自带的统一响应封装对象SaResult,不然返回的对象格式不是标准的json格式,亲自试过踩坑

springboot项目解决跨域的几种方式相关推荐

  1. SpringBoot解决跨域的5种方式

    本文来说下SpringBoot中实现跨域的5种方式. 文章目录 什么是跨域 java解决CORS跨域请求的方式 返回新的CorsFilter(全局跨域) 重写WebMvcConfigurer(全局跨域 ...

  2. 什么是同源策略及解决跨域的三种方式

    同源策略 1.1.1 所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源.同源策略/SOP(Same origin policy)是一种约 ...

  3. SpringBoot 中实现跨域的5种方式

    作者:ratelfu blog.csdn.net/weter_drop/article/details/112135940 一.为什么会出现跨域问题 出于浏览器的同源策略限制.同源策略(Sameori ...

  4. 后端技术:SpringBoot 中实现跨域的5种方式

    作者:ratelfu blog.csdn.net/weter_drop/article/details/112135940 一.为什么会出现跨域问题 出于浏览器的同源策略限制.同源策略(Sameori ...

  5. 前端实现跨域的三种方式

    前端解决跨域的三种方式: 1.cors跨域(只需要后端配置) header("Access-Control-Allow-Origin:*"); // 允许任何来源 header(& ...

  6. Springboot 解决跨域的四种姿势

    Springboot 解决跨域的四种姿势 姿势一 实现WebMvcConfigurer#addCorsMappings的方法 import org.springframework.context.an ...

  7. vue开发环境和生产环境里面解决跨域的几种方法

    vue开发环境和生产环境里面解决跨域的几种方法 参考文章: (1)vue开发环境和生产环境里面解决跨域的几种方法 (2)https://www.cnblogs.com/pass245939319/p/ ...

  8. 只有ajax会跨域吗_ajax处理跨域有几种方式

    jQuery 使用 JSONP 缺点: 1.这种方式无法发送post请求(这里) 2.另外要确定jsonp的请求是否失败并不容易,大多数框架的实现都是结合超时时间来判定. 跨域的几种方式 在项目中可能 ...

  9. SpringBoot解决跨域问题的六种方式

    一.同源策略 同源,就是咱们域名.端口号.ip.采用的协议都相同,那么我们就是同源的 反之就是不同源的!!! 出于浏览器的同源策略限制.同源策略(Sameoriginpolicy)是一种约定,它是浏览 ...

最新文章

  1. What is Wiki?
  2. 动态多维数组在 VC 中的应用
  3. python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...
  4. .net 中使用socket (c#)
  5. 数据存储与传输---编码与解码---硬盘和内存要分清!
  6. Spring学习总结(16)——Spring AOP实现执行数据库操作前根据业务来动态切换数据源
  7. 《Mastering opencv....读书笔记》基于标记的虚拟现实
  8. 【转载】.NET系统学习----Assembly
  9. ubuntu环境下安装opencv教程及测试
  10. 步进驱动系统:步进电机与步进驱动器控制原理简述
  11. 小刘的编程学习技巧分享
  12. MongoDB与物联网应用讲座
  13. 服务器vga转hdmi显示器不亮,如何排除HDMI转VGA的常见故障_排除故障的四种方法
  14. SCI、EI、ISTP国际三大检索分别指的是什么?
  15. 计算机更新一直在57转怎么办,win10系统更新到57%出现死机的原因和解决方法
  16. 开心一笑,,,哈哈哈
  17. python matplotlib坐标轴刻度设置
  18. 从“走出淘系”到“Ad Tech”,阿里妈妈迎来品牌焕新
  19. Python基于PC版微信实现机器人
  20. jfinal批量操作

热门文章

  1. Spring配置实现AOP
  2. 能不能翻译PHP网站源码,有朋友可以帮忙用PHP翻译一段PYTHON代码吗?
  3. 机器人参数校准的原理
  4. 数据结构之链表及其Java实现_数据结构之链表及其Java实现
  5. 在线可视化python网站_利用Python优雅地可视化数据
  6. oracle select机制_ORACLE的工作机制(转载)
  7. obs多推流地址_什么都比不上动手能力,OBS 推流实践小记
  8. python如何用c语言表示_python如何调用c语言
  9. 实验2-2-7 整数四则运算 (10 分)
  10. cad常青藤插件_CAD作图效率低怎么办?最全辅助插件大合集,绘图效率提升70%,限时分享...