关于使用SpringSecurity框架发起JSON请求,但因登陆失效导致响应403的问题。

这里记录一个生产中遇到的一个问题。

现有环境是基于SpringBoot 2.6.8,然后是前后台一体化的项目。

安全框架使用的是内置版本的SpringSecurity。

在实际使用过程中遇到一个问题。

就是当用户登陆失效后,前端操作JSON请求获取列表数据,但因为登陆失效了。导致请求过不去返回结果

同时服务端也没有任何的异常日志。

后来发现是因为Security内置的一个过滤器CsrfFilter。这个过滤器

this.accessDeniedHandler.handle(request, response, exception);

有个处理起对这个请求进行了处理,同时转发到了error页面。

解决方案如下:

1.首先需要实现上述过滤器内调用的处理器

import cn.com.seecom.vnumber.common.Result;
import cn.com.seecom.vnumber.common.ResultEnum;
import cn.com.seecom.vnumber.utils.RequestUtil;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @author lvshiyu* @description: 重写当请求访问被拒绝处理* 在基于角色的访问控制(RBAC)或基于权限的访问控制(PBAC)系统中,当用户尝试访问他们没有权限的资源时,* Spring Security 会触发 AccessDeniedHandler 来处理这种情况。* @date 2024年03月13日 17:55*/
@Component
@Slf4j
public class CustomAccessDeniedHandler implements AccessDeniedHandler {private String errorPage;@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {if (response.isCommitted()) {log.trace("Did not write to response since already committed");return;}if (RequestUtil.isAjaxRequest(request)) {// 重点是这里,判断如果是ajax请求,则返回对应的登陆失效JSON。response.setContentType("application/octet-stream;charset=UTF-8");response.getWriter().println(JSON.toJSON(new Result(ResultEnum.TOKEN_EXPIRED)));return;}if (this.errorPage == null) {log.debug("Responding with 403 status code");response.sendError(HttpStatus.FORBIDDEN.value(), HttpStatus.FORBIDDEN.getReasonPhrase());return;}// Put exception into request scope (perhaps of use to a view)request.setAttribute(WebAttributes.ACCESS_DENIED_403, accessDeniedException);// Set the 403 status code.response.setStatus(HttpStatus.FORBIDDEN.value());// forward to error page.request.getRequestDispatcher(this.errorPage).forward(request, response);}public void setErrorPage(String errorPage) {Assert.isTrue(errorPage == null || errorPage.startsWith("/"), "errorPage must begin with '/'");this.errorPage = errorPage;}}

2.在配置类中引入该处理器,这里涉及到部分的业务代码,所以采用截图的方式,只需要将上面的失效处理器配置到config中即可。

3.在前端JS内对发起请求的地方做统一拦截处理。

$.ajaxSetup({complete: function(xhr, status) {if (xhr.responseText == 'invalidSession') {if(window.parent){window.parent.location.reload();}else{window.location.reload();}}//优化统一AJAX拦截if (xhr.status == 200 && xhr.responseJSON != null) {let data = xhr.responseJSON;if (data.code == 1000) {console.log("登陆失效")//登陆超时window.location.reload();}}}});

这里就解决了上述所说的问题,如果对您有帮助 请帮忙点个赞。

注意:这里重写了原来的403异常信息,会导致原有出现403的异常都会通过JSON的方式发送所改造的响应字符串。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/5042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

323_C++_QT_使用QProcess执行cmd解压tar.gz等等其他压缩包文件到指定目录,不需要外部库,QT自带API的就行

// decompressPath : 解压到此目录 // fileName : 解压的tar.gz文件名executeCommand(decompressPath , QString::fromStdString(fileName));// 开始解压 void executeCommand

visual studio code安装Clicknium

visual studio code下载安装 Download Visual Studio Code - Mac, Linux, Windows 安装python extend,需要把科学上网关了 clicknium 获取插件名 clicknium 录制教程 https://blog.51cto.com/u_16213624/7007362 实战教程: Python 自动化神器 Click…

上海亚商投顾:沪指创年内新高 房地产板块掀涨停潮

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 三大指数昨日继续反弹,沪指盘中涨超1%,重返3100点上方,深成指涨超2%&#…

如何确定当前项目是采用 Vite 还是 Vue CLI 项目

查看项目的配置文件和依赖 对于 Vite 项目: 检查项目根目录下是否有一个名为 vite.config.js 或 vite.config.ts 的文件。这是 Vite 项目的配置文件。 在 package.json 文件中,查看 dependencies 和 devDependencies 部分是否包含 vite 和 vitejs/plug…

初探 JUC 并发编程:Java 并发包中并发 List 源码剖析

最近在阅读 《Java 并发编程之美》这本书,感觉学到了很多东西;所以我决定将从事书中学到的思想和一些经典的案例整理成博客的形式与大家分享和交流,如果对大家有帮助别忘了留下点赞和关注捏。 第五部分:Java 并发包中并发 List 源…

性能监控之prometheus+grafana搭建

前言 Prometheus和Grafana是两个流行的开源工具,用于监控和可视化系统和应用程序的性能指标。它们通常一起使用,提供了强大的监控和数据可视化功能。 Prometheus Prometheus是一种开源的系统监控和警报工具包。它最初由SoundCloud开发,并于…

【亲测有效】Element UI 自定义 Notification 通知样式不生效,设置this.$notify样式不生效问题

不生效的源代码 <style lang"scss" scoped> ::v-deep .el-notification__group {margin-left: 130px; } </style><style lang"scss" scoped> .el-notification__group {margin-left: 130px; } </style>以上两种代码均不生效 解决…

Android log tag标签如am_pss意义

Android log tag标签如am_pss意义 Android输出日志中不同的标签代表不同的意义&#xff0c;比如 am_pss&#xff0c;则代表内存回收&#xff08;整理&#xff09;。定义在源代码文件 &#xff1a; https://android.googlesource.com/platform/frameworks/base//master/servic…

匠心精神与创新力量:构筑网络安全的新防线

一、匠心精神在网络安全中的重要性 匠心精神代表着对工作的专注和对质量的极致追求。在网络安全领域&#xff0c;这意味着对每一个安全漏洞的深入挖掘&#xff0c;对每一项安全技术的精心打磨。亿林网络李璐昆的提名&#xff0c;正是对其在网络安全领域匠心精神的认可。 二、…

A/B测试

在当今数字化时代&#xff0c;数据驱动的决策已经成为企业取得成功的关键。而在众多数据驱动的策略中&#xff0c;A/B测试无疑是一种强大且实用的工具。本文将深入探讨A/B测试的概念、原理、应用案例以及其重要性&#xff0c;旨在帮助读者更好地理解并应用这一方法。 一、A/B测…

PCL 模版对齐

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 在 PCL 中,模板对齐(template alignment)通常指的是将一个点云与另一个点云进行配准(registration)的过程。PCL为我们提供了多种方法来实现点云的配准,其中包括特征匹配、迭代最近点(ICP)算法等。具体过程如…

Python数据分析大作业(ARIMA 自回归积分滑动平均模型) 4000+字 图文分析文档 销售价格库存分析+完整python代码

资源地址&#xff1a;Python数据分析大作业 4000字 图文分析文档 销售分析 完整python代码 完整代码分析 ​ 同时销售量后1000的sku品类占比中&#xff08;不畅销产品&#xff09;如上&#xff0c;精品类产品占比第一&#xff0c;达到66.7%&#xff0c;其次是香化类产品&#x…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-8.1

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

使用opencv改变图片大小

使用opencv改变图片大小 图片的宽度和高度效果代码 图片的宽度和高度 宽度&#xff1a;图片的宽度指的是图像从左边缘到右边缘的水平跨度。在数字图像中&#xff0c;宽度通常是以像素&#xff08;pixels&#xff09;为单位来度量的。高度&#xff1a;图片的高度指的是图像从上…

【go项目01_学习记录day01】

博客系统 1 vscode开发go项目插件推荐1.1 CtrlShiftP&#xff08;俗称万能键&#xff09; &#xff1a;打开命令面板。在打开的输入框内&#xff0c;可以输入任何命令。1.2 开发时&#xff0c;我们需要经常查阅 Go 语言官方文档&#xff0c;可惜因国内访问外网不稳定&#xff0…

[Java EE] 多线程(五):单例模式与阻塞队列

1. 单例模式 单例模式是校招中最长考的设计模式之一,首先我们来谈一谈什么是设计模式: 设计模式就好像象棋中的棋谱一样,如果红方走了什么样的局势,黑方就有一定地固定地套路,来应对这样的局势,按照固定地套路来,可以保证在该局势下不会吃亏. 软件开发也是同样的道理,有很多…

Linux基础-socket详解、TCP/UDP

文章目录 一、Socket 介绍二、Socket 通信模型三、Socket 常用函数1 创建套接字2 绑定套接字3、监听连接4、接受连接5、接收和发送数据接收数据发送数据 6、关闭套接字 四、Socket编程试验1、源码server.cclient.c 2、编译&#xff1a;3、执行结果 五、补充TCP和UDP协议的Socke…

OpenAI 新推出 AI 问答搜索引擎——SearchGPT 震撼登场

您的浏览器不支持 video 标签。 OpenAI-SearchGPT 近日&#xff0c;OpenAI 曝光了自己的一款令人瞩目的 AI 问答搜索引擎——SearchGPT。这款搜索引擎带来了全新的搜索体验&#xff0c;给整个行业带来了巨大的压力。 SearchGPT 支持多种强大的功能。首先&#xff0c;它能够通过…

CentOS8 安装ansible

CentOS8 无法使用yum进行ansible安装&#xff0c;此次使用pip install ansible来安装ansible 大概步骤 1&#xff0c;编译安装升级python&#xff0c;centos8系统自动安装的python3.6版本过低&#xff0c;安装ansible时会有警告 2&#xff0c;安装pip 3&#xff0c;pip install…

SpringCloud特殊问题处理1——通过Feign传递List类型参数

在微服务项目的开发过程中&#xff0c;远程数据接口调用是必需的操作。其中绝大部分的接口写法和用法与api相似&#xff0c;但是对于List<Obj>这种对象的参数使用需要异常关注。 1.List<Obj>对象集合参数传递 注意&#xff1a; Feign接口不能直接使用List<Ob…