spring异常相关知识
-
阿里四面:Spring Exception的原理你精通了吗?错误场景 验证请求的Token合法性的Filter。Token校验失败时,直接抛自定义异常,移交给Spring处理: 测试HTTP请求: 日志输出如下:说明IllegalRequestExceptionHandler未生效。 why? 这就需要精通Spring异常处理流程了。 解析 当所有Filter被执行完毕,Spring才会处理Servlet相关,而DispatcherServlet才是整个Servlet处理核心,它是前端控制器设计模式,提供 Spring Web MVC 的集中访问点并负责职责的分派。 在这,Spring处理了请求和处理器的对应关系及统一异常处理。 Filter内
-
Spring Boot:异常处理机制最近公司的项目正在重构,我正好担任了这个重任,采用的是Spring Boot和Docker的方式,因此很长时间没在更新博客了,在接下一段时间中我会将Spring Boot构建项目这块持续更新,最终能构建一个完整的Spring Boot基础架构,并开源出来分享给大家,Spring Cloud的那个项目在之后还会持续更新的。在Spring Boot中,当最终有未处理的异常抛出的时候,Servlet容器仍然会发送/error请求,但是和spring mvc不同的是,Spring Boot提供了内置的BasicErrorController处理全局的错误信息,不需要任何其他的配置。下面通过一个简单的例子验证一下Spring Boot中默认的异常处理流程:首先在SysUserController中映射index请求,接口中什么都不做,仅抛出一个RuntimeException异常。/** * 系统用户 * @Auther: hrabbit * 
-
一文搞定 Spring Security 异常处理机制!今天来和小伙伴们聊一聊 Spring Security 中的异常处理机制。 在 Spring Security 的过滤器链中,ExceptionTranslationFilter 过滤器专门用来处理异常,在 ExceptionTranslationFilter 中,我们可以看到,异常被分为了两大类:认证异常和授权异常,两种异常分别由不同的回调函数来处理,今天松哥就来和大家分享一下这里的条条框框。 1.异常分类 Spring Security 中的异常可以分为两大类,一种是认证异常,一种是授权异常。 认证异常就是 AuthenticationException,它有众多的实
-
Spring Security 实战干货:自定义异常处理1. 前言 最近实在比较忙,很难抽出时间来继续更 Spring Security 实战干货系列。今天正好项目中 Spring Security 需要对认证授权异常的处理,就分享出来吧 。 2. Spring Security 中的异常 Spring Security 中的异常主要分为两大类:一类是认证异常,另一类是授权相关的异常。 2.1 AuthenticationException AuthenticationException 是在用户认证的时候出现错误时抛出的异常。主要的子类如图: 根据该图的信息,系统用户不存在,被锁定,凭证失效,密码错误等认证过程中出
spring异常相关课程
spring异常相关教程
- 2.3 Spring Boot 默认异常处理 我们在启动项目, Spring Boot Web 项目默认启动端口为 8080 ,所以直接访问 http://127.0.0.1:8080 ,显示如下:Spring Boot 默认异常信息提示页面如上图所示,Spring Boot 默认的异常处理机制生效,当出现异常时会自动转向 /error 路径。
- 2. Spring Boot 默认异常处理机制 Spring Boot 开发的 Web 项目具备默认的异常处理机制,无须编写异常处理相关代码,即可提供默认异常机制,下面具体演示下。
- 7. 异常链 异常链是以一个异常对象为参数构造新的异常对象,新的异常对象将包含先前异常的信息。简单来说,就是将异常信息从底层传递给上层,逐层抛出,我们来看一个实例:public class ExceptionDemo5 { /** * 第一个自定义的静态内部异常类 */ static class FirstCustomException extends Exception { // 无参构造方法 public FirstCustomException() { super("第一个异常"); } } /** * 第二个自定义的静态内部异常类 */ static class SecondCustomException extends Exception { public SecondCustomException() { super("第二个异常"); } } /** * 第三个自定义的静态内部异常类 */ static class ThirdCustomException extends Exception { public ThirdCustomException() { super("第三个异常"); } } /** * 测试异常链静态方法1,直接抛出第一个自定义的静态内部异常类 * @throws FirstCustomException */ public static void f1() throws FirstCustomException { throw new FirstCustomException(); } /** * 测试异常链静态方法2,调用f1()方法,并抛出第二个自定义的静态内部异常类 * @throws SecondCustomException */ public static void f2() throws SecondCustomException { try { f1(); } catch (FirstCustomException e) { throw new SecondCustomException(); } } /** * 测试异常链静态方法3,调用f2()方法, 并抛出第三个自定义的静态内部异常类 * @throws ThirdCustomException */ public static void f3() throws ThirdCustomException { try { f2(); } catch (SecondCustomException e) { throw new ThirdCustomException(); } } public static void main(String[] args) throws ThirdCustomException { // 调用静态方法f3() f3(); }}运行结果:Exception in thread "main" ExceptionDemo5$ThirdCustomException: 第三个异常 at ExceptionDemo5.f3(ExceptionDemo5.java:46) at ExceptionDemo5.main(ExceptionDemo5.java:51)运行过程:通过运行结果,我们只获取到了静态方法 f3() 所抛出的异常堆栈信息,前面代码所抛出的异常并没有被显示。我们改写上面的代码,让异常信息以链条的方式 “连接” 起来。可以通过改写自定义异常的构造方法,来获取到之前异常的信息。实例如下:/** * @author colorful@TaleLin */public class ExceptionDemo6 { /** * 第一个自定义的静态内部异常类 */ static class FirstCustomException extends Exception { // 无参构造方法 public FirstCustomException() { super("第一个异常"); } } /** * 第二个自定义的静态内部异常类 */ static class SecondCustomException extends Exception { /** * 通过构造方法获取之前异常的信息 * @param cause 捕获到的异常对象 */ public SecondCustomException(Throwable cause) { super("第二个异常", cause); } } /** * 第三个自定义的静态内部异常类 */ static class ThirdCustomException extends Exception { /** * 通过构造方法获取之前异常的信息 * @param cause 捕获到的异常对象 */ public ThirdCustomException(Throwable cause) { super("第三个异常", cause); } } /** * 测试异常链静态方法1,直接抛出第一个自定义的静态内部异常类 * @throws FirstCustomException */ public static void f1() throws FirstCustomException { throw new FirstCustomException(); } /** * 测试异常链静态方法2,调用f1()方法,并抛出第二个自定义的静态内部异常类 * @throws SecondCustomException */ public static void f2() throws SecondCustomException { try { f1(); } catch (FirstCustomException e) { throw new SecondCustomException(e); } } /** * 测试异常链静态方法3,调用f2()方法, 并抛出第三个自定义的静态内部异常类 * @throws ThirdCustomException */ public static void f3() throws ThirdCustomException { try { f2(); } catch (SecondCustomException e) { throw new ThirdCustomException(e); } } public static void main(String[] args) throws ThirdCustomException { // 调用静态方法f3() f3(); }}运行结果:Exception in thread "main" ExceptionDemo6$ThirdCustomException: 第三个异常 at ExceptionDemo6.f3(ExceptionDemo6.java:74) at ExceptionDemo6.main(ExceptionDemo6.java:80)Caused by: ExceptionDemo6$SecondCustomException: 第二个异常 at ExceptionDemo6.f2(ExceptionDemo6.java:62) at ExceptionDemo6.f3(ExceptionDemo6.java:72) ... 1 moreCaused by: ExceptionDemo6$FirstCustomException: 第一个异常 at ExceptionDemo6.f1(ExceptionDemo6.java:51) at ExceptionDemo6.f2(ExceptionDemo6.java:60) ... 2 more运行过程:通过运行结果,我们看到,异常发生的整个过程都打印到了屏幕上,这就是一个异常链。
- 3.2 全局异常处理器 Spring MVC 提供了名为 SimpleMappingExceptionResolver 的异常处理组件,该组件实现了 HandlerExceptionResolver 接口,或者说实现了这个接口的对象都可称其为全局异常处理器。何谓全局异常处理器?通俗讲,有点类似于前端控制器的设计思路。Spring MVC 把所有异常分离出来后通通交给全局异常处理器做集中处理。使用流程:打开项目中的 WebConfig 配置类,添加组件;@Beanpublic SimpleMappingExceptionResolver simpleMappingExceptionResolver() { SimpleMappingExceptionResolver simResolver=new SimpleMappingExceptionResolver(); //异常处理页面 simResolver.setDefaultErrorView("error"); //封装异常信息的属性名,默认是 exception simResolver.setExceptionAttribute("exception"); //添加自定义异常信息 Properties mappings=new Properties(); mappings.put("com.mk.web.exception.MyException", "/WEB-INF/jsp/exception.jsp"); simResolver.setExceptionMappings(mappings); return simResolver;}代码中有注解,不再多言。自定义异常类。自定义异常类并不是必须的,项目中自定义异常的目的可以让异常的语义更具体;public class MyException extends Exception { public MyException() { } public MyException(String msg) { super(msg); }}编写控制器。控制器中的方法会根据 userName 的值决定是否抛出异常。 @RequestMapping("/exception03") public String exception03(String userName) throws MyException { if (StringUtils.isEmpty(userName)) { throw new MyException("用户名不能为空"); } return "index"; }测试。打开浏览器,输入 http://localhost:8888/sm-demo/exception03 ;浏览器会显示把错误导向到 “WEB-INF/exception.jsp” 页面。此页面,可添加下面的代码。 <body> 出错啦!${exception.message} </body> 解析出错误的具体信息,最后可以在浏览器中看到:开发者可以根据需要编写自己的全局异常处理器组件。
- 2. 异常处理流程 Spring Security 的认证、授权异常在过滤器校验过程中产生,并在 ExceptionTranslationFilter 中接收并进行处理,其流程如下:图1. ExceptionTranslationFilterExceptionTranslationFilter 过滤器首先像其他过滤器一样,调用过滤器链的执行方法 FilterChain.doFilter(request, response) 启动过滤处理;如果当前的用户没有通过认证或者因为其他原因在执行过程中抛出了 AuthenticationException 异常,此时将开启「认证流程」:清空 SecurityContextHolder 对象;并将原始请求信息「request」保存到 RequestCache 对象中;使用 AuthenticationEntryPoint 对象存储的认证地址,向客户端索要身份证明。例如,使用浏览器登录的用户,将浏览器地址重定向到 /login 或者回传一个 WWW-Authenticate 认证请求头。如果当前用户身份信息已确认,但是没有访问权限,则会产生 AccessDeniedException 异常,然后访问被拒绝。继续执行拒绝处理 AccessDeniedHandler。假如认证过程中没有产生「认证异常」或者「权限异常」,ExceptionTranslationFilter 则不做任何处理。
- 1.异常处理 当遇到异常时,Django Rest framework 会自动捕获,并按默认逻辑处理。我们也可以通过自定义异常处理函数来实现对异常的处理。from rest_framework.views import exception_handlerdef custom_exception_handler(exc, context): # 先调用REST framework默认的异常处理方法获得标准错误响应对象 response = exception_handler(exc, context) # 在此处补充自定义的异常处理 if response is not None: response.data['status_code'] = response.status_code return response在配置文件中声明自定义的异常处理REST_FRAMEWORK = { 'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'}如果未声明,会采用默认的方式,如下REST_FRAMEWORK = { 'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler'}例如:补充上处理关于数据库的异常from rest_framework.views import exception_handler as drf_exception_handlerfrom rest_framework import statusfrom django.db import DatabaseErrordef exception_handler(exc, context): response = drf_exception_handler(exc, context) if response is None: view = context['view'] if isinstance(exc, DatabaseError): print('[%s]: %s' % (view, exc)) response = Response({'detail': '服务器内部错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE) return response
spring异常相关搜索
-
s line
safari浏览器
samba
SAMP
samplerate
sandbox
sanitize
saper
sas
sass
save
smarty模板
smil
smtp
snapshot
snd
snmptrap
soap
soapclient
soap协议