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进行全局跨域配置
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项目解决跨域的几种方式相关推荐
- SpringBoot解决跨域的5种方式
本文来说下SpringBoot中实现跨域的5种方式. 文章目录 什么是跨域 java解决CORS跨域请求的方式 返回新的CorsFilter(全局跨域) 重写WebMvcConfigurer(全局跨域 ...
- 什么是同源策略及解决跨域的三种方式
同源策略 1.1.1 所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源.同源策略/SOP(Same origin policy)是一种约 ...
- SpringBoot 中实现跨域的5种方式
作者:ratelfu blog.csdn.net/weter_drop/article/details/112135940 一.为什么会出现跨域问题 出于浏览器的同源策略限制.同源策略(Sameori ...
- 后端技术:SpringBoot 中实现跨域的5种方式
作者:ratelfu blog.csdn.net/weter_drop/article/details/112135940 一.为什么会出现跨域问题 出于浏览器的同源策略限制.同源策略(Sameori ...
- 前端实现跨域的三种方式
前端解决跨域的三种方式: 1.cors跨域(只需要后端配置) header("Access-Control-Allow-Origin:*"); // 允许任何来源 header(& ...
- Springboot 解决跨域的四种姿势
Springboot 解决跨域的四种姿势 姿势一 实现WebMvcConfigurer#addCorsMappings的方法 import org.springframework.context.an ...
- vue开发环境和生产环境里面解决跨域的几种方法
vue开发环境和生产环境里面解决跨域的几种方法 参考文章: (1)vue开发环境和生产环境里面解决跨域的几种方法 (2)https://www.cnblogs.com/pass245939319/p/ ...
- 只有ajax会跨域吗_ajax处理跨域有几种方式
jQuery 使用 JSONP 缺点: 1.这种方式无法发送post请求(这里) 2.另外要确定jsonp的请求是否失败并不容易,大多数框架的实现都是结合超时时间来判定. 跨域的几种方式 在项目中可能 ...
- SpringBoot解决跨域问题的六种方式
一.同源策略 同源,就是咱们域名.端口号.ip.采用的协议都相同,那么我们就是同源的 反之就是不同源的!!! 出于浏览器的同源策略限制.同源策略(Sameoriginpolicy)是一种约定,它是浏览 ...
最新文章
- What is Wiki?
- 动态多维数组在 VC 中的应用
- python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...
- .net 中使用socket (c#)
- 数据存储与传输---编码与解码---硬盘和内存要分清!
- Spring学习总结(16)——Spring AOP实现执行数据库操作前根据业务来动态切换数据源
- 《Mastering opencv....读书笔记》基于标记的虚拟现实
- 【转载】.NET系统学习----Assembly
- ubuntu环境下安装opencv教程及测试
- 步进驱动系统:步进电机与步进驱动器控制原理简述
- 小刘的编程学习技巧分享
- MongoDB与物联网应用讲座
- 服务器vga转hdmi显示器不亮,如何排除HDMI转VGA的常见故障_排除故障的四种方法
- SCI、EI、ISTP国际三大检索分别指的是什么?
- 计算机更新一直在57转怎么办,win10系统更新到57%出现死机的原因和解决方法
- 开心一笑,,,哈哈哈
- python matplotlib坐标轴刻度设置
- 从“走出淘系”到“Ad Tech”,阿里妈妈迎来品牌焕新
- Python基于PC版微信实现机器人
- jfinal批量操作
热门文章
- Spring配置实现AOP
- 能不能翻译PHP网站源码,有朋友可以帮忙用PHP翻译一段PYTHON代码吗?
- 机器人参数校准的原理
- 数据结构之链表及其Java实现_数据结构之链表及其Java实现
- 在线可视化python网站_利用Python优雅地可视化数据
- oracle select机制_ORACLE的工作机制(转载)
- obs多推流地址_什么都比不上动手能力,OBS 推流实践小记
- python如何用c语言表示_python如何调用c语言
- 实验2-2-7 整数四则运算 (10 分)
- cad常青藤插件_CAD作图效率低怎么办?最全辅助插件大合集,绘图效率提升70%,限时分享...