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

本文主要是介绍关于使用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的方式发送所改造的响应字符串。

这篇关于关于使用SpringSecurity框架发起JSON请求,但因登陆失效导致响应403的问题。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/940594

相关文章

laravel 框架给$request添加数据 阿星小栈

方法一: $request->offsetSet('course_type', 10010005);说明:course_type:键名 10010005:键值 方法二: $request->merge(['course_type'=>10010005]);说明:course_type:键名10010005:键值注意:括弧里面是数组

在vue项目中使用echarts 阿星小栈

在后台管理系统中,图表是一个很普遍的元素。目前常用的图标插件有 charts,  Echarts, highcharts。这次将介绍 Echarts 在 Vue 项目中的应用。 安装echarts依赖 npm install echarts -S 或者使用国内的淘宝镜像: 安装 npm install -g cnpm --registry=https://registry.npm.

iview 在Table组件render 中使用Poptip组件 阿星小栈

render: (h, params) => {return h('div', [h('Button', {props: {type: 'error', size: 'small'},},[h('Poptip', {props: {confirm: true,transfer: true,placement: 'left-end',title: '确定要删除吗!',type: 'error',si

逐步解决动态添加样式导致的元素闪烁 阿星小栈

元素闪烁很丑,难解决。 修改 Class 而不是 Style 我在不久前做过一个导航栏,要求其滚动到屏幕顶端后固定。很常见。开始的时候没问题,很快就可以搞定。 nav {position: absolute;top: 60px;} var scroll=0;var nav=$("nav");var navST=60; //该元素距离网页顶端60px$(window).scrol

Java 高级面试问题及答案 更新(一)

Java 高级面试问题及答案 1. 请解释Java内存模型以及它在多线程编程中的重要性。 答案: Java内存模型(Java Memory Model, JMM)定义了Java程序在执行时,变量在内存中的存储和访问规则。它确保了在多线程环境中,各个线程对共享数据的一致性和同步操作的原子性。JMM规定了线程之间共享变量的读写操作,必须遵循特定的规则,以避免内存一致性错误,如竞态条件和死锁。 在

glog的编译和使用

文章目录 glog的编译和使用概述笔记测试工程glog0.7这个版本是有问题的工程的预处理宏日志测试代码好使的代码效果备注 - 只有C++风格的日志才好使备注 - glog用不到gflagEND glog的编译和使用 概述 想在DLL中打些日志,测试用。 没用起来。 将gflags和gtest都测试编译测试过了,再整一下glog。 笔记 库地址 https://githu

FileZilla FTP 425 Can't open data connection 问题解决办法 阿星小栈

FTP各种连不上,网上各种查之后说是被动模式配置端口 https://blog.csdn.net/qq_16030133/article/details/79962153  服务端用的是FileZilla,进入FileZilla设置里面切换成被动加上端口: 结果发现还是不行,原来是阿里云的安全组也要把这些端口配上(进出都要配):   然鹅  还是不行 后来发现是服务器防火墙拦截

PHP json_encode返回的json前端获取时出现unicode转码和反斜杠\导致无法解析的解决办法...

今天用PHP写一个接口文件出现了一个非常奇葩的问题,首先我的json字符串绝对没有问题,然后使用json_encode编码后echo出去作为接口的返回值。前端使用JS获取接口返回的json对象时,返回的是一个字符串,不是Object(正常应该返回JSON的Object)。而且这个字符串还被Unicode转码过。 (截图只贴了一部分json值) 我以为Unicode转码的问题,就在网上找

约瑟夫问题No.2 C/C++和Java代码

题目描述 问题 n个小孩围坐成一圈,并按顺时针编号为1,2,…,,从编号为p 的小孩顺时针依次报数,由1报到m,报到m时,这名小孩从圈中出去;然后下一名小孩再从1报数,报到m 时再出去。以此类推,直到所有小孩都从圈中出去。请按出去的先后顺序输出小孩的编号。 输入 第一个是n,第二个是p,第三个是 m(0<m,n<300)。 最后一行是:0 0 0。 输出 按出圈的顺序输出

修改json数据中的任意key值对应的value值

#include <nlohmann/json.hpp>#include <iostream>#include <string>// 递归函数,用于找到键并修改其对应的值voidmodifyValueByKey(nlohmann::json& j, const std::string& key, const nlohmann::json& new_value){if (j.is_obje