Spring Boot学习随笔- 后端实现全局异常处理(HandlerExceptionResolver),前后端解决跨域问题(@CrossOrigin(局部解决)自定义跨域配置类(全局))

这篇具有很好参考价值的文章主要介绍了Spring Boot学习随笔- 后端实现全局异常处理(HandlerExceptionResolver),前后端解决跨域问题(@CrossOrigin(局部解决)自定义跨域配置类(全局))。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习视频:【编程不良人】2021年SpringBoot最新最全教程

第十七章、异常处理

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

传统方式

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

  • 配置全局异常处理类

    @Component
    public class GlobalExceptionResolver implements HandlerExceptionResolver {
        @Override
        public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
            System.out.println("进入全局异常处理");
            System.out.println("当前异常为 = " + ex);
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.setViewName("500"); //跳转错误页面
            return modelAndView;
        }
    }
    

    resolveException:当控制器方法出现异常时,如果该方法没有try...catch,则会进入当前方法

  • 针对不同异常返回不同的错误显示页面

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("进入全局异常处理");
        System.out.println("当前异常为 = " + ex);
        ModelAndView modelAndView = new ModelAndView();
        // 针对不同异常类型跳转不同页面
        **if (ex instanceof UserNameNotFoundException) {
            modelAndView.setViewName("error");
            return modelAndView;
        }**
        modelAndView.setViewName("500"); //跳转错误页面
        return modelAndView;
    }
    

前后端分离开发异常处理

  • **@ControllerAdvice**

    @ControllerAdvice是Spring框架中用于全局处理异常的注解,修饰类,可以定义全局性的处理器方法,用于处理应用程序中所有Controller层抛出的异常。

    **@ControllerAdvice(value="com.baizhi.controller")** 可以通过value属性设置生效的包

  • **@ExceptionHandler**

    @ExceptionHandler注解用于处理异常的注解。修饰方法,用于捕获特定类型的异常并进行处理。

    **@ExceptionHandler(value = {Exception.class,``UserNameNotFoundException.class})** 通过value属性定义多个异常进行处理

@ControllerAdvice(value = "com.baizhi.controller")
public class GlobalExceptionResolver {

    // 指定自定义异常或其他异常需要返回不同的结果
    @ExceptionHandler(value = UserNameNotFoundException.class)
    @ResponseBody
    public ResponseEntity<String> exceptionHandlers(Exception e) {
        System.out.println("进入非法参数异常处理");
        return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }

    // 处理所以异常
    @ExceptionHandler(value = Exception.class) //修饰方法,作用:处理指定异常,value属性:指定处理异常类型
    @ResponseBody
    public ResponseEntity<String> exceptionHandler(Exception e) {
        System.out.println("进入自定义异常处理");
        return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }

}

第十八章、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

  • 哪些操作不会受到同源限制

    1. script:src=””,
  • 哪些操作会受到同源限制

    ajax

    出现跨域请求

  • 示例

    <!doctype html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script>
            function test(){
                var xhr = new XMLHttpRequest();
                xhr.onreadystatechange = function (){
                    if (xhr.status == 200 && xhr.readyState == 4) {
                        console.log(xhr.responseText);
                        document.getElementById("msg").innerText="返回结果为:"+xhr.responseText;
                    }
                }
                xhr.open("GET", "http://localhost:8989/demo");
                xhr.send();
            }
        </script>
    </head>
    <body>
        <h1>测试跨域</h1>
        <input type="button" value="发送跨域请求" onclick="test()">
        <h4 id="msg"></h4>
    </body>
    </html>
    

    我们使用idea内置服务器打开此静态网页测试,会出现跨域错误,因为不同源

    Spring Boot学习随笔- 后端实现全局异常处理(HandlerExceptionResolver),前后端解决跨域问题(@CrossOrigin(局部解决)自定义跨域配置类(全局))

SpringBoot解决跨域问题

  • 局部解决跨域

    **@CrossOrigin**:修饰类和方法,代表被修饰的所有方法都能允许进行跨域请求

    @RestController
    @RequestMapping("demo")
    **@CrossOrigin**
    public class DemoController {
        @GetMapping
        public ResponseEntity<String> demo() {
            System.out.println("demo ok");
            return new ResponseEntity<>("响应demo ok", HttpStatus.OK);
        }
    
  • 全局解决跨域

    自定义跨域配置类

    **import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
    import org.springframework.web.filter.CorsFilter;**
    
    @Configuration
    public class CorsConfig {
        @Bean
        public CorsFilter corsFilter() {
            UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
            CorsConfiguration corsConfiguration = new CorsConfiguration();
            corsConfiguration.addAllowedOrigin("*"); // 允许任何域名使用
            corsConfiguration.addAllowedHeader("*"); // 允许任何头
            corsConfiguration.addAllowedMethod("*"); // 允许任何方法
            source.registerCorsConfiguration("/**", corsConfiguration);// 配置所有请求
            return new CorsFilter(source);
        }
    }
    

注意,只能使用一种跨域解决方法,两种都用会出现问题

下一章:Spring Boot学习随笔- Jasypt加密数据库用户名和密码以及解密文章来源地址https://www.toymoban.com/news/detail-760645.html

到了这里,关于Spring Boot学习随笔- 后端实现全局异常处理(HandlerExceptionResolver),前后端解决跨域问题(@CrossOrigin(局部解决)自定义跨域配置类(全局))的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot 优雅实现统一数据返回格式+统一异常处理+统一日志处理

            在我们的项目开发中,我们都会对数据返回格式进行统一的处理,这样可以方便前端人员取数据,当然除了正常流程的数据返回格式需要统一以外,我们也需要对异常的情况进行统一的处理,以及项目必备的日志。         在项目开发中返回的是json格式的数据

    2024年01月19日
    浏览(43)
  • Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包部署和war包部署

    学习视频:【编程不良人】2021年SpringBoot最新最全教程 拦截器 :Interceptor 拦截 中断 类似于javaweb中的Filter,不过没有Filter那么强大 作用 Spring MVC的拦截器是一种用于在请求处理过程中进行预处理和后处理的机制。拦截器可以在请求到达控制器之前和之后执行一些操作,例如日

    2024年02月02日
    浏览(51)
  • Spring Boot学习随笔- 集成MyBatis-Plus(三)自定义SQL、分页实现(PaginationInterceptor )、更新和删除详细方法

    学习视频:【编程不良人】Mybatis-Plus整合SpringBoot实战教程,提高的你开发效率,后端人员必备! 自定义mapper文件是为了应对一些更复杂的查询场景,首先先配置映射路径 由于这里的mapper文件放在java文件夹中,所以要在pom.xml里进行配置 mapper 测试 在MyBatis Plus中, 物理分页 和 内

    2024年02月03日
    浏览(57)
  • Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】

    目录 一、单个控制器异常处理 1.1 控制器方法 1.2 编写出错页面 1.3 测试结果 二、全局异常处理 2.1 一个有异常的控制器类 2.2 全局异常处理器类 2.3 测试结果  三、自定义异常处理器 3.1 自定义异常处理器 3.2 测试结果 往期专栏文章相关导读  1. Maven系列专栏文章 2. Mybatis系列

    2024年02月16日
    浏览(45)
  • Spring MVC配置全局异常处理器!!!

    为什么要使用全局异常处理器:如果不加以异常处理,错误信息肯定会抛在浏览器页面上,这样很不友好,所以必须进行异常处理。 系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图: 结果展示:  

    2024年01月15日
    浏览(45)
  • Spring MVC文件上传及全局异常处理器

    编写controller 在index.jsp里面定义超链接 如果不加以异常处理,错误信息肯定会抛在浏览器页面上,这样很不友好,所以必须进行异常处理。 系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图: 编写c

    2024年01月18日
    浏览(49)
  • Spring Boot 统一功能处理(拦截器实现用户登录权限的统一校验、统一异常返回、统一数据格式返回)

    目录 1. 用户登录权限校验 1.1 最初用户登录权限效验 1.2 Spring AOP 用户统⼀登录验证 1.3 Spring 拦截器 (1)创建自定义拦截器 (2)将自定义拦截器添加到系统配置中,并设置拦截的规则 1.4 练习:登录拦截器 (1)实现 UserController 实体类 (2)返回的登录页面:login.html (3)实

    2024年02月12日
    浏览(50)
  • Spring Boot异常处理!!!

    SpringBoot默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常 SpringBoot 会向/error 的 url 发送请求。在 springBoot 中提供了一个叫 BasicErrorController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常信息 如 果我 们 需 要 将 所

    2024年01月20日
    浏览(38)
  • Spring Boot异常处理

            SpringBoot默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常 SpringBoot 会向/error 的 url 发送请求。在 springBoot 中提供了一个叫 BasicErrorController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常信息。 如 果我

    2024年01月17日
    浏览(93)
  • 记录spring boot 异常处理

    这个异常通常表示在映射文件中出现了重复的别名定义 命名规范:在定义别名时,建议采用一致的命名规范。例如,使用首字母大写的驼峰命名法或者全小写的下划线命名法,这样可以避免不同开发人员或团队在命名时产生冲突。 预留前缀:可以在别名前加上特定的前缀,

    2024年01月21日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包