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 优雅实现统一数据返回格式+统一异常处理+统一日志处理

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

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

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

    Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包部署和war包部署

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

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

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

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

    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日
    浏览(14)
  • Spring MVC配置全局异常处理器!!!

    Spring MVC配置全局异常处理器!!!

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

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

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

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

    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日
    浏览(29)
  • Spring Boot异常处理!!!

    Spring Boot异常处理!!!

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

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

    Spring Boot异常处理

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

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

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

    2024年01月21日
    浏览(11)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包