Spring Security自定义异常 AccessDeniedHandler不生效解决方法

 更新时间:2023年07月18日 10:53:56   作者:小麟School  
本文主要介绍了Spring Security自定义异常 AccessDeniedHandler不生效解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

【出现场景】

最近在项目中通过Security实现单点登录的时候,发现明明应该触发 AccessDeniedException 异常,但没有报出来,应该是报了GlobalException里面定义的全局异常,发现是被全局异常捕获了。项目还原成本有点大 我就先把大体解决流程记录一下。

【解决思路】

既然发现是被全局异常捕获掉了,我们就把思路放到 如何让异常不被全局异常捕获,而自己定义异常 进行错误消息的配置呢?

首先新增一个类

@Component
public class MyAccessDeniedHandler implements AccessDeniedHandler {
    private static final ObjectMapper objectMapper=new ObjectMapper();
    @Override
    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse  httpServletResponse, AccessDeniedException e) throws IOException, ServletException {
        //在这里返回一个包含着错误信息的对象数据
        JsonResult jsonResult=JsonResult.fail(ServiceCode.ERR_FORBIDDEN, "您无此权限!");
        httpServletResponse.setContentType("application/json;charset=utf-8");
        httpServletResponse.getWriter().write(objectMapper.writeValueAsString(jsonResult));
        httpServletResponse.flushBuffer();
    }
}

通过实现AccessDeniedHandler 接口 重写的handle 方法进行捕获,AcceseDeniedException异常.

至此 可能就算解决完了?

可能一般项目中 这样解决就可以了,但是我发现配置后并没有生效 ,还是会被Global里的最高Exception捕获。

【再次解析】

因为我们是分布式的项目。查阅一些资料后 在实现单点登录的项目中新增了如下类

@ControllerAdvice
public class AccessDeniedExceptionHandler {
    @ExceptionHandler(AccessDeniedException.class)
    public void accessDeniedException(AccessDeniedException e) throws AccessDeniedException{
        throw e;
    }
}

首先 说 @ControllerAdvice注解

@ControllerAdvice 本质也是一个@Component,所以配置上这个注解 也会被当成组件扫描

简要说明一下该注解的意思。简单来说 他就是一个拦截类,在@ExcepitonHandler 或 @ModelAttribute注解修饰的)方法的类而提供的专业化的Component, 以供多个Controller类所共享。简单来理解 就是AOP的思想的注解实现,咱们通过@ExceptionHandler注解 配置好规则,ControllerAdvice就会帮咱们进行拦截。

默认情况下 如果@ControllerAdvice什么都不写 就是拦截所有controller 。如果想指定包拦截 可以这样写  @ControllerAdvice(basePackages = "com.xxx.controller")进行指定包的拦截。

接下来看@ExceptionHandler注解

简单来说 就是对指定的异常 进行处理。

@ExceptionHandler 注解 是要和 @ControllerAdvice 注解搭配到一起用的。

 可以看到 ExceptionHandler里面的参数 只有一个Throwable ,这也就是说他可以接收任何Throwable类型的异常。 使用方法如我上面所示这样 @ExceptionHandler(AccessDeniedException.class)进行配置即可

 这样就是进行 AccessDeniedException 异常的拦截。

说回正文,在我的项目中添加完@ControllerAdvice注解的这个类后,报异常时就不会再走 GlobalException 全局配置的异常了,深层次的原因我没有深挖,我觉得应该是本项目中配置的@ControllerAdvice注解要晚于Global的包@ControllerAdvice的加载时间吧。

配置完这个类后,第一个MyAccessDeniedHandler 类就发现起了作用了。

到此这篇关于Spring Security自定义异常 AccessDeniedHandler不生效解决方法的文章就介绍到这了,更多相关Spring Security AccessDeniedHandler不生效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Java+SSM实现电影院购票系统

    基于Java+SSM实现电影院购票系统

    今天小编给大家带来一款SSM的电影院售票系统,非常不错的一个项目,是学习​javaweb编程必备。文中的示例代码讲解详细,需要的可以参考一下
    2022-04-04
  • Spring常用注解 使用注解来构造IoC容器的方法

    Spring常用注解 使用注解来构造IoC容器的方法

    下面小编就为大家分享一篇Spring常用注解 使用注解来构造IoC容器的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • 浅析Java的Hibernate框架中的继承关系设计

    浅析Java的Hibernate框架中的继承关系设计

    这篇文章主要介绍了Java的Hibernate框架中的继承关系设计,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12
  • RestTemplate添加HTTPS证书全过程解析

    RestTemplate添加HTTPS证书全过程解析

    这篇文章主要介绍了RestTemplate添加HTTPS证书全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 使用mybatis的typeHandler对clob进行流读写方式

    使用mybatis的typeHandler对clob进行流读写方式

    这篇文章主要介绍了使用mybatis的typeHandler对clob进行流读写方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 使用Java进行Json数据的解析(对象数组的相互嵌套)

    使用Java进行Json数据的解析(对象数组的相互嵌套)

    下面小编就为大家带来一篇使用Java进行Json数据的解析(对象数组的相互嵌套)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Java使用toString方法展示枚举字段信息

    Java使用toString方法展示枚举字段信息

    这篇文章主要为大家详细介绍了如何在Java中通过重写枚举的toString方法来展示枚举实例的字段信息,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-01-01
  • springboot实现发送QQ邮箱

    springboot实现发送QQ邮箱

    这篇文章主要为大家详细介绍了springboot实现发送QQ邮箱,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • springboot自定义配置及自定义对象映射的全流程

    springboot自定义配置及自定义对象映射的全流程

    这篇文章主要介绍了springboot自定义配置及自定义对象映射的全流程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Java十分钟精通异常处理机制

    Java十分钟精通异常处理机制

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等
    2022-03-03

最新评论