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

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

时间:2023-12-27 16:35:14浏览次数:33  
标签:跨域 自定义 处理 class new 全局 异常 public

学习视频:【编程不良人】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内置服务器打开此静态网页测试,会出现跨域错误,因为不同源

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);
        }
    }
    

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

标签:跨域,自定义,处理,class,new,全局,异常,public
From: https://www.cnblogs.com/eyewink/p/17930814.html

相关文章

  • vue2 自定义插件
    自定义插件的基本使用:letMyPlugin={};MyPlugin.install=function(Vue,options){//1.添加全局方法或propertyVue.myGlobalMethod=function(){//逻辑...}//2.添加全局资源Vue.directive('my-directive',{bind(el,binding,vnode,......
  • Go简单自定义协程池
    packagemainimport( "fmt" "sync")typeTaskstruct{ ffunc()error}varwgsync.WaitGrouptypePoolstruct{ //任务通道 JobQueuechanTask //worker通道 WorkerQueuechanchanTask //worker数量 MaxWorkersint}funcNewPool(ma......
  • 自定义php日志类收集应用日志
    <?phpclassMiniLog{ privatestatic$_instance; private$_path; private$_pid; private$_handleArr; function__construct($path){ $this->_path=$path; $this->_pid=getmypid(); } privatefunction__clone(){ } publics......
  • day21 Prometheus Operator优化配置 -Prometheus Operator自定义监控对象(7.13-7.14)
    7.13-PrometheusOperator优化配置1、数据持久化1.1prometheus数据持久化默认Prometheus和Grafana不做数据持久化,那么服务重启以后配置的Dashboard、账号密码、监控数据等信息将会丢失,所以做数据持久化也是很有必要的。原始的数据是以emptyDir形式存放在pod里面,生命周期与po......
  • kafka 自定义开发Sink Connector组件(兼容mysql和oracle)
    1.情景展示目前,市场上已有不少能从kafka消费数据的插件,如:io.confluent.connect.jdbc.JdbcSinkConnector,但这个组件有个致命的问题是,只能同步字符串类型。具体意思是:源库源表的日期类型字段,往目标库目标表插入数据的时候,只能是字符串类型,无法自动将其转成日期类型。这样一来的......
  • 项目自定义代码规范
    2023年底了马上2024年了,今年没写几篇文章,事情太多。长大是痛苦的要经历很多。收~进入正题今天带来一个创建项目团队合作开发的规范。跟上我的步伐,从0-1开始吧!eslintESLint是一个可配置的JavaScript检查器。它可以帮助你发现并修复JavaScript代码中的问题。问题可以指......
  • iview 表格列自定义样式 & public.css 公共样式里面引用图片方式
    {title:'操作',key:'action',align:'center',renderHead:()=>{},//自定义表头样式className:'col_oper',width:120,render:(h,params)=&g......
  • Python中全局解释器GIL的相关问题
    1、全局解释器锁(GIL)的影响Python中可以实现多线程,但是受到全局解释器锁(GIL)的限制,因此在某些情况下,多线程并不能实现真正的并行执行。这是因为在CPython中,由于GIL的存在,同一时刻只能有一个线程执行Python字节码(解释器层面的限制)。本质上来说,GIL只会影响解释器层面运行python......
  • 自定义开发odoo14的统计在线用户人数 (续)
    上一篇是只统计在过去几分钟内有活动的用户是在线的。今天我们来处理当浏览器关闭后,才算是离线用户,否则算在线用户。 要实现当浏览器关闭后才算用户离线的功能,在Odoo中较为复杂,因为Odoo服务器端无法直接检测到客户端浏览器的关闭事件。不过,我们可以通过一种近似的方法来实......
  • 自定义开发odoo14的统计在线用户人数
    在Odoo14中统计在线人数通常涉及到定制开发或者使用特定的模块。自定义开发:如果没有现成的模块,您可能需要进行一些自定义开发。这通常涉及到扩展Odoo的用户模型,以跟踪用户的登录和登出活动。以下是一个基本的实现思路:扩展用户模型:在用户模型(通常是res.users)中添加字段来记......