Spring Boot学习随笔- 后端实现全局异常处理(HandlerExceptionResolver) ...

打印 上一主题 下一主题

主题 852|帖子 852|积分 2556

学习视频:【编程不良人】2021年SpringBoot最新最全教程
第十七章、异常处理

异常处理作用:用来解决整合系统中任意一个控制器抛出异常时的统一处理入口
传统方式

传统单体架构下的处理方式

  • 配置全局异常处理类
    1. @Component
    2. public class GlobalExceptionResolver implements HandlerExceptionResolver {
    3.     @Override
    4.     public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    5.         System.out.println("进入全局异常处理");
    6.         System.out.println("当前异常为 = " + ex);
    7.         ModelAndView modelAndView = new ModelAndView();
    8.         modelAndView.setViewName("500"); //跳转错误页面
    9.         return modelAndView;
    10.     }
    11. }
    复制代码
    resolveException:当控制器方法出现异常时,如果该方法没有try...catch,则会进入当前方法
  • 针对不同异常返回不同的错误显示页面
    1. @Override
    2. public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    3.     System.out.println("进入全局异常处理");
    4.     System.out.println("当前异常为 = " + ex);
    5.     ModelAndView modelAndView = new ModelAndView();
    6.     // 针对不同异常类型跳转不同页面
    7.     **if (ex instanceof UserNameNotFoundException) {
    8.         modelAndView.setViewName("error");
    9.         return modelAndView;
    10.     }**
    11.     modelAndView.setViewName("500"); //跳转错误页面
    12.     return modelAndView;
    13. }
    复制代码
前后端分离开发异常处理


  • **@ControllerAdvice**
    @ControllerAdvice是Spring框架中用于全局处理异常的注解,修饰类,可以定义全局性的处理器方法,用于处理应用程序中所有Controller层抛出的异常。
    **@ControllerAdvice(value="com.baizhi.controller")** 可以通过value属性设置生效的包
  • **@ExceptionHandler**
    @ExceptionHandler注解用于处理异常的注解。修饰方法,用于捕获特定类型的异常并进行处理。
    **@ExceptionHandler(value = {Exception.class,``UserNameNotFoundException.class})** 通过value属性定义多个异常进行处理
  1. @ControllerAdvice(value = "com.baizhi.controller")
  2. public class GlobalExceptionResolver {
  3.     // 指定自定义异常或其他异常需要返回不同的结果
  4.     @ExceptionHandler(value = UserNameNotFoundException.class)
  5.     @ResponseBody
  6.     public ResponseEntity<String> exceptionHandlers(Exception e) {
  7.         System.out.println("进入非法参数异常处理");
  8.         return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
  9.     }
  10.     // 处理所以异常
  11.     @ExceptionHandler(value = Exception.class) //修饰方法,作用:处理指定异常,value属性:指定处理异常类型
  12.     @ResponseBody
  13.     public ResponseEntity<String> exceptionHandler(Exception e) {
  14.         System.out.println("进入自定义异常处理");
  15.         return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
  16.     }
  17. }
复制代码
第十八章、CORS

CORS(跨源资源共享)是一种用于解决跨域请求问题的机制。
在Web开发中,由于浏览器的同源策略,不同源(域名、协议、端口号任何一个不同)之间的前端JavaScript代码无法直接进行跨域请求。
CORS的核心思想是在服务器端响应中添加一些特定的HTTP头部,以允许来自其他源的请求访问服务器资源。这些头部包括Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers等。

  • 同源策略
    是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。同源策略是浏览器安全的基石
  • 什么是源 origin
    源就是协议、域名和端口号。例如:http://www.baidu.com:80这个url
    协议:http
    域名:www.baidu.com
    端口:80
  • 哪些操作不会受到同源限制

  • 哪些操作会受到同源限制
    ajax
    出现跨域请求
  • 示例
    1. <!doctype html>
    2. <html>
    3. <head>
    4.     <meta charset="UTF-8">
    5.     <title>Title</title>
    6.    
    7. </head>
    8. <body>
    9.     <h1>测试跨域</h1>
    10.     <input type="button" value="发送跨域请求" onclick="test()">
    11.     <h4 id="msg"></h4>
    12. </body>
    13. </html>
    复制代码
    我们使用idea内置服务器打开此静态网页测试,会出现跨域错误,因为不同源

SpringBoot解决跨域问题


  • 局部解决跨域
    **@CrossOrigin**:修饰类和方法,代表被修饰的所有方法都能允许进行跨域请求
    1. @RestController
    2. @RequestMapping("demo")
    3. **@CrossOrigin**
    4. public class DemoController {
    5.     @GetMapping
    6.     public ResponseEntity<String> demo() {
    7.         System.out.println("demo ok");
    8.         return new ResponseEntity<>("响应demo ok", HttpStatus.OK);
    9.     }
    复制代码
  • 全局解决跨域
    自定义跨域配置类
    1. **import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
    2. import org.springframework.web.filter.CorsFilter;**
    3. @Configuration
    4. public class CorsConfig {
    5.     @Bean
    6.     public CorsFilter corsFilter() {
    7.         UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    8.         CorsConfiguration corsConfiguration = new CorsConfiguration();
    9.         corsConfiguration.addAllowedOrigin("*"); // 允许任何域名使用
    10.         corsConfiguration.addAllowedHeader("*"); // 允许任何头
    11.         corsConfiguration.addAllowedMethod("*"); // 允许任何方法
    12.         source.registerCorsConfiguration("/**", corsConfiguration);// 配置所有请求
    13.         return new CorsFilter(source);
    14.     }
    15. }
    复制代码
注意,只能使用一种跨域解决方法,两种都用会出现问题

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

雁过留声

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表