springboot(shiro)+vue(axios)跨域问题记录

Springboot + Vue + shiro 实现前后端分离、权限控制 本文总结自实习中对项目的重构。原先项目采用Springboot+freemarker模版,开发过程中觉得前端逻辑写的实在恶心,后端Controller层还必须返回Freemarker模版的ModelAndView,逐渐有了前后端分离的想法,由于之前,没有接触过,主要参考的还是网上的一些博客教程等,初步完成了前后端分离,在此记录以备查阅。 一、前后端分离思想 前端从后端剥离,形成一个前端工程,前... 阅读详情
1. 通用设置

一旦前后端分离,就涉及到跨域问题(域名、端口、协议(http或https等)其一不一样就是跨域)。
在涉及到跨域问题时,浏览器发送请求前,会优先发送一个OPTION请求。
所以,对于springboot项目,只需要自定义一下web过滤器即可。

/**
 * 解决跨域问题
 */
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://xx.xx.xx.xx:port")
                .allowCredentials(true)
                .maxAge(3600)
                .allowedHeaders("Accept", "Content-Type", "Origin", "Authorization", "X-Auth-Token")
                .exposedHeaders("X-Auth-Token", "Authorization")
                .allowedMethods("POST", "GET", "DELETE", "PUT", "OPTIONS");
    }
}

说明:

  • allowedOrigins:一般情况下配置"*"和配合"ip:port"都行,但是在某些情况下,出现后者可以,前者不行的问题。故先建议配成具体的ip(*后续再试即可)。
  • allowCredentials:普通跨域,这个值无所谓,true或false都可以。(但是有shiro认证,必须为true,下文再说)
  • allowedHeaders、allowedMethods:允许OPTION即可。
    经过上述一个配置即可,前端也不需要任何配置,如前端:
let instance = axios.create({
  baseURL: host,
  timeout: 120000
})
2. 携带cookie的跨域

shiro用户认证在浏览器cookie中存在JSESSIONID信息,发送请求时,会携带信息。因此,需要前端和后端,都需要设置允许Credentials。

前端设置

加一条设置,如:

let instance = axios.create({
  baseURL: host,
  timeout: 120000
})
instance.defaults.withCredentials = true
后端设置

也只需要在前述的WebConfig类中修改一条配置:

WebConfig
...
.allowCredentials(true)
...

至此,shiro + axios跨域初步解决。

初步解决的问题有哪些呢?shiro认证拦截已经生效,未登录情况下,访问被拦截。登录之后,不会被拦截。如:
/login接口:

    @GetMapping("/login")
    public RootRespBody<Boolean> login() {
        Subject subject = SecurityUtils.getSubject();
        if(!subject.isAuthenticated()){
            return RootRespBody.failure(RootRespBody.Status.ACCESS_DENIED, "please login", false);
        }
        return RootRespBody.success(true);
    }

登录后访问直接成功:

{"status":200,"message":"SUCCESS","data":true}

3. shiro + vue

上述配置在shiro + vue的项目中并不能正常使用,原因是跨域时,请求会发送两个,一个OPTION, 一个正常的请求。
在这里插入图片描述
通常是OPTIONS Reqeust正常返回status 200,然后才发起正式的GET/POST等访问,但因为Shiro配置了URL过滤, 对于OPTIONS Request也进行了拦截,OPTION是没有携带cookie信息的,所以无法继续访问,后续实际的请求也就不会发送。
在这里插入图片描述
上述截图只发送了OPTION请求,由于该请求没通过,没有发送真正的需要的请求。

解决方法:shiro配置,允许OPTION不经过过滤器。

public class MyAuthenticationFilter extends FormAuthenticationFilter {
    /**
     * @desc  跨域时,先发送option请求,option是不携带cookie信息的,但是也被shiro拦截了导致不通过,无法发送正常请求
     *        因此需要将OPTION放行。
     * @param request
     * @param response
     * @param mappedValue
     * @return
     */
    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
        if (request instanceof HttpServletRequest) {
            if (((HttpServletRequest) request).getMethod().toUpperCase().equals("OPTIONS")) {
                return true;
            }
        }
        return super.isAccessAllowed(request, response, mappedValue);
    }

    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response)
            throws Exception {
        WebUtils.toHttp(response).sendError(HttpServletResponse.SC_UNAUTHORIZED);
        return false;
    }
}

在shiro 配置中手动加上:

		//以下两行配合MyAuthenticationFilter过滤器使用
		Map<String, Filter> filterMap = shiroFilterFactoryBean.getFilters();
		filterMap.put("authc", new MyAuthenticationFilter());

至此,完成!
其他:后续可以考虑重定向的优化。
参考:
https://www.jianshu.com/p/e56362315581

springboot+shiro 跨域解决(OPTIONS) /可以用response.getWriter()返回json或你想要的格式,同时设置header: Content-Type:text/json。logger.info(“token过期返回403”);logger.info(“OPTIONS 放行”);logger.error(“空指针异常”, e);logger.info(“token有效放行”);//这几句代码是关键。 阅读详情

相关推荐

前后端分离使用shiro登录认证cookie跨域问题踩坑

基于cookie, session的登录认证一般后端需要将session id保存在cookie中,这样下次请求时浏览器带上cookie,服务器才知道是同一个会话,根据session id取出session中保存的用户信息,以确定用户是否已登录。 在前后端分离模式下,前端一般通过ajax请求向服务器请求数据,但是如果前后端部署在不同的域名下,因为一些安全机制,cookie无法跨域携带,所以如果还想基于cookie, session来实现就要做一些配置以实现cookie可以跨越携带。 ...

gitcat的博客 3990

跨域 以及 shiro解决

跨域 以及 shiro解决 同源策略:协议、域名、端口 作用:能帮助阻隔恶意文档,减少可能被攻击的媒介。 # 但也导致了跨域的问题的出现:前后端分离 # 前端访问后端,不满足同源策略,所以不能访问 1、反向代理解决 # 配置反向代理来实现跨域 # 前端访问代理 # 代理访问后端 # 代理将结果返回给前端 # 从而实现了跨域 2、CORS跨域 CORS(Cross-Origin Resource Sharing)跨域资源共享,定义了必须在访问跨域资源时,浏览器与服务器应该如何沟通。CORS的基本思想就

RealGUO的博客 4178

Springboot+Vue+shiro实现前后端分离、权限控制

原先项目采用Springboot+freemarker模版,开发过程中觉得前端逻辑写的实在恶心,后端Controller层还必须返回Freemarker模版的ModelAndView,逐渐有了前后端分离的想法,由于之前,没有接触过,主要参考的还是网上的一些博客教程等,初步完成了前后端分离,在此记录以备查阅。 一、前后端分离思想 前端从后端剥离,形成一个前端工程,前端只利用Json来...

u010637366的博客 2303

解决Shiro跨域问题

由于项目需要springboot项目接入了shiro进行登录验证。做法是在在每一个接口的heards部分增加token,后台拿到token后进行验证。在postman测试没问题。但是,前端却一直报options500错误。 原来,是浏览器的同源策略引起的。 什么是同源策略? 源(origin)就是协议、域名和端口号。同源策略是浏览器的一种安全功能,不同源(协议或域名或端口不同)之间不能相...

u010042669的博客 1万+

开发博客系统SpringBoot+Vue教程

个人的开发挑战计划1

fhzmWJ的博客 2553

springboot(jeesite)跨域解决Cross origin requests are only supported for protocol schemes:

Cross origin requests are only supported for protocol schemes: http, data, isolated-app, chrome-extension, chrome, https, chrome-untrusted。错误

淘淘小窝 1187

springboot+jwt+shiro+vue+elementUI+axios+redis+mysql完成一个前后端分离的博客项目(笔记,帮填坑)

根据B战MarkerHub视频制作 B战博主链接: https://www.bilibili.com/video/BV1PQ4y1P7hZ?p=1 博主的开发文档: https://juejin.cn/post/6844903823966732302 开源项目: https://github.com/GoogTech/vsblog 简易博客项目springboot+jwt+shiro+vue 目录(ctrl+F可锁定查找) 第一步 创建项目(第八步骤就行) 第二步 第一步 创建项目(第八步骤就行) 第一

weixin_43247803的博客 4万+

AI量化交易工作台Vibe-Trading:用自然语言驱动策略回测与多智能体研究

量化交易通过数学模型和计算机程序执行投资决策,其核心在于将市场规律转化为可验证的策略。传统量化开发涉及数据获取、策略编写、回测验证等复杂工程,对非编程背景的从业者构成较高门槛。随着大语言模型技术的发展,自然语言交互正成为降低技术使用难度的关键。Vibe-Trading项目正是这一趋势的实践,它将金融工程任务封装为可调用的工具与技能,允许用户通过自然语言指令直接驱动策略回测、因子研究和投资组合分析。其技术价值在于构建了一个模块化的AI Agent框架,通过ReAct推理框架协调多个专项技能,并创新性地引入多智

weixin_28695161的博客 1565

SpringBoot之vue访问shiro时出现的跨域问题的解决(前后端分离项目)

1.声明 当前的内容用于记录当前前后端分离的vue项目,并且在SpringBoot中开启了Shiro进行权限控制,此时出现的跨域的问题,以及当前的解决方法 2.一般的跨域请求 1.基于WebMvcConfigurer是实现的 @Configuration public class CorsConfig implements WebMvcConfigurer { private Log log...

编程学习者的博客 2778

【计算机组成原理】实验4:单周期CPU(Verilog)中海大

【计算机组成原理】实验4:单周期CPU

m0_63023532的博客 3659

SAP FICO CK40N批量发布标准价:常见报错排查与实战解决指南

本文详细解析了SAP FICO模块中CK40N批量发布标准价的常见报错及解决方案。从物料选择、成本核算到最终发布的全流程,提供了针对'已有标准成本估算记号'等典型报错的实战处理技巧,并分享了预防性维护与批量处理的高效方法,帮助财务人员提升工作效率。

weixin_29234509的博客 304

Vue + Spring Boot + Shiro 跨域解决(开发+生产)

相信大家刚开始做都会遇到这个问题,在这里记录一下,希望对大家有所帮助 一、配置Vue前端 在config下index。js

Java 璐到底 1847

ROS 2 Jazzy与Gazebo Harmonic仿真实战:从零搭建机器人仿真环境与高级应用

本文详细介绍了如何使用ROS 2 Jazzy和Gazebo Harmonic从零搭建机器人仿真环境,涵盖环境配置、传感器集成、多机器人协同和GPU加速优化等高级应用。通过实战案例和性能调优技巧,帮助开发者高效构建可靠的机器人仿真系统,提升开发效率。

h9j8k7l6m5n的博客 1217

Spring Boot多模块+ Shiro + Vue:前后端分离登陆整合,权限认证

前言 本文主要使用spring boot + shiro + vue来实现前后端分离的认证登陆和权限管理,适合和我一样刚开始接触前后端完全分离项目的同学,但是你必须自己搭建过前端项目和后端项目,本文主要是介绍他们之间的互通,如果不知道这么搭建前端项目的同学可以先找别的blog看一下。 自己摸索了一下,可能会有一些问题,也有可能有更好的实现方式,但这个demo主要是用来记录自己搭建系统,独立完成前后端分离项目的过程,并且作为自己的毕业设计框架。所以有问题的话欢迎提出,共同交流。源码在github上,有需要的.

小小陈的博客 8595

基于BERTopic模型的英文20新闻数据集主题聚类及可视化

BERTopic是基于深度学习的一种主题建模方法。BERT是一种用于NLP的预训练策略,它成功地利用了句子的深层语义信息。

Cachel Wood的博客 1460

QT实现图片ROI区域的框选、移动、缩放(附完整源码)

QT实现图片ROI区域的框选、移动、缩放(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1191

springboot 跨域配置 cookie_Springboot + Vue + shiro 实现前后端分离、权限控制

本文总结自实习中对项目的重构。原先项目采用Springboot+freemarker模版,开发过程中觉得前端逻辑写的实在恶心,后端Controller层还必须返回Freemarker模版的ModelAndView,逐渐有了前后端分离的想法,由于之前,没有接触过,主要参考的还是网上的一些博客教程等,初步完成了前后端分离,在此记录以备查阅。一、前后端分离思想前端从后端剥离,形成一个前端工程,前端只利用...

weixin_39934302的博客 938

【HAL库】STM32CubeMX开发----STM32F407----ETH+LAN8720A+LWIP----ping通

本次实验以芯片为MCU,使用25MHz外部时钟源。以太网PHY层芯片为LAN8720A,由MCU引脚PA8提供时钟。

MQ0522的博客 4841

记录一次springboot跨域问题

记录一次前后端项目,前端使用Vue和后端springboot之间的跨域问题记录: 我刚开始的时候,前端配置的就是axios.defaults.withCredentials=true,后端即使配置了@CrossOrigin也不会解决当前问题! 如果您的后端使用的也是springboot的话,可以直接在controller类上加上@CrossOrigin注解(用来解决后端跨域问题) 前端加上 :axios.defaults.withCredentials = false; ...

weixin_46043881的博客 183

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Spring Boot + Vue + Shiro 实现前后端分离,写得太好了!

程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 8 分钟。作者:_Yufan来源:www.cnblogs.com/yfzhou/p/9813177.html本文总结自...

良月柒 601

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Springboot 项目源码 vue.js html 跨域 前后分离 shiro权限

官网:www.fhadmin.org 特别注意: Springboot 工作流前后分离 + 跨域 版本 (权限控制到菜单和按钮) 后台框架:springboot2.1.2+ activiti6.0.0+ mybaits+maven+接口 前端页面:html +vue.js 形式 jquery ajax 异步跨域 json 格式数据交互 前后分离,前后台分开部署 (特别注意,前端用的v...

weixin_33994444的博客 1207

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

springboot+vue前后端分离项目跨域问题引发的思考

其实这个问题一开始是解决的,一个@CrossOrigin搞定,但是后来在shiro中获取用户的时候有获取不到的问题,特别记录! 为啥又跟shiro扯上关系呢?因为shiro认证授权都没问题,登录也没毛病,但是在获取菜单的时候俺需要get到当前用户的时候就有问题了,明明相同的配置,为啥就是获取不到呢?百度到一个论坛上大佬说前台要传cookie下来(其实是一个sessionId),俺还是很纳闷,但是...

weixin_42748017的博客 405
上一篇: shiro安全框架
下一篇: springboot版本切换引发的Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContain
王小禾
博客等级 码龄11年 80粉丝 291原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值