异常处理机制

二者冲突吗?  

异常处理机制_第1张图片

1.授权是在filter(FilterSecurityInterceptor)  不会被全局异常捕获

2.认证过程比较复杂

JwtAuthenticationTokenFilter  这个过滤器中的异常不会被全局捕获

loadUserByUsername中的异常方法会被全局捕获 (进入controller,所以能被全局异常捕获,即被controllerAdvice捕获)

结论: 不会冲突,只要保证两种异常处理机制返回相同格式的json即可!

一、SpringSecurity的异常处理机制

异常处理机制_第2张图片

希望在认证失败或者是授权失败的情况下也能和我们的接口一样返回相同结构的json,这样可以让前端能对响应进行统一的处理。

在SpringSecurity中,如果我们在认证或者授权的过程中出现了异常会被ExceptionTranslationFilter捕获到。在ExceptionTranslationFilter中会去判断是认证失败还是授权失败出现的异常。

如果是认证过程中出现的异常会被封装成AuthenticationException然后调用AuthenticationEntryPoint对象的方法去进行异常处理。

如果是授权过程中出现的异常会被封装成AccessDeniedException然后调用AccessDeniedHandler对象的方法去进行异常处理。

所以如果我们需要自定义异常处理,我们只需要自定义AuthenticationEntryPoint和AccessDeniedHandler然后配置给SpringSecurity即可。

异常处理机制_第3张图片

异常处理机制_第4张图片

二、  springboot 统一异常处理

我们对SpringBoot全局的异常处理有哪些呢?_文渡呀的博客-CSDN博客

使用方式

定义一个类,使用@ControllerAdvice注解该类,使用@ExceptionHandler注解方法。@RestControllerAdvice注解是@ControllerAdvice注解的扩展(@RestControllerAdvice=@ControllerAdvice+@ResponseBody),返回值自动为JSON的形式。

三 throw和throws的区别

详述throw 和throws;检查时异常与运行时异常_JAVAnuonuo的博客-CSDN博客_throw()可以抛出检查异常吗前者是抛出 后者是声明   

以下这行代码和 1/0是一样的 都是运行时异常  这行代码是手动抛出 1/0是系统抛 

所有的运行时异常都继承了RnuTimeException

 throw new MyException(ResponseCode.PASSWORD_ERROR);


2023/1/14 

在做fortune的项目时候 

异常处理机制_第5张图片

 try里面的CSVUtils.readSalesImportDataCSV(file) 报了异常 但是程序没有停  还是插入了 

点开该方法 发现该方法用了try catch  所以不会被这里的try-catch捕捉到 

一点点总结: fortune 没有用全局处理  而是对于运行时异常采取了try-catch  发生异常被捕捉后 “5.如果发生异常,回滚数据,终止处理,发送邮件通知,更新EDI配置信息表,EDI履历主表,EDI履历明细表”

用到全局处理则另当别论  但是道理相通

通常会将事务配置在 Service 层, 当数据库操作失败时, 让 Service 层抛出运行时异常, 而不进行 try-catch 处理, Spring 事物管理器就会进行回滚. 为了事务回滚

但 Service 层抛出后. 在 Controller 层就需要 try-catch 去捕获异常, 否则会返回原生错误信息到客户端. 但是, 如果在 Controller 层的每个方法体里面都写一些模板化的 try-catch 的代码, 代码不但不美观, 也增加了维护的难度, 特别是还需要对 Service 层的不同异常进行不同处理的时候.

异常处理机制_第6张图片

所以说 catch中又抛出异常 是为了回滚! 


 

你可能感兴趣的:(spring,boot,后端,java)