当前位置: 首页 > news >正文

跟着江南一点雨学习springmvc(3)

springmvc中的异常捕获

        第一种方式,实现HandlerExceptionResolver 接口

package com.qfedu.deom.exception;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 第一种全局异常处理器
 * 这是一个全局异常处理类,使用的时候,只需要将这个类注册到 Spring 容器中即可
 */
//@Component
public class MyGlobalException implements HandlerExceptionResolver {
    /**
     * 当系统抛出异常的时候,会自动触发的方法
     * @param request
     * @param response
     * @param handler 发生问题的处理器(具体的接口)
     * @param ex 具体抛出的异常
     * @return
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
                                         Exception ex) {
        ModelAndView modelAndView = new ModelAndView("error");
        modelAndView.addObject("error",ex.getMessage());
        return modelAndView;

    }
}

        第二种方式,使用注解@ExceptionHandler(重点学习)

package com.qfedu.deom.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 第二种全局异常处理器
 * 全局异常处理
 * <p>
 * 这个类的定义,和我们定义接口的规则是一模一样的
 *
 * 注意要是在过滤器中发生了异常,这三种全局异常处理器都是捕获不到的,因为那是一种Tomcat容器级别的异常,这三种全局异常处理方法都是处理spring
 * 容器里的异常,都基于aop实现的。
 */
@RestControllerAdvice
public class MyGlobalException2 {

    /**
     * 这个异常处理方法的返回值,和定义接口时候的返回值的类型是一模一样的
     * 这个方法的参数也和接口的参数基本一致,接口中的默认参数,这里也都可以直接添加后使用
     *
     * 默认情况下,即使系统抛出异常,调用了下面的方法,但是 HTTP 响应的状态码依然是 200
     *
     * @return
     * @ExceptionHandler(ArithmeticException.class) 表示当系统发生 ArithmeticException 异常的时候,进入到当前的方法中进行处理
     */

    //如果发生该类型异常 则进入下面这个方法
    @ExceptionHandler(ArithmeticException.class)
    //如果设置了下面这个注解里面的内容 浏览器状态码为500
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public String error(Exception e){
        return e.getMessage();
    }

}

        第三种方式,注册bean的方式

<!--    这是第三种全局异常处理  但不能传参数  了解即可-->
 <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
<!-- 这是捕获的异常类型和跳转的页面 -->
                <prop key="java.lang.ArithmeticException">error</prop>
            </props>
        </property>
    </bean>

springmvc中的拦截器

        类似于过滤器,但又不一样。

        Filter是Tomcat的组件,interceptor是在spring容器中的。interceptor在Filter之后执行,Filter过滤的是请求,interceptro拦截的是处理器。

        实现HandlerInterceptor 接口就可以:

package com.qfedu.demo.interceptor;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 类似于过滤器,但是不一样
 * 1. Filter 是 Tomcat 容器中的工具;Interceptor 是 Spring 容器中的
 * 2. Interceptor 是在 DispatcherServlet 中被调用的,Filter 则在 Servlet 之前执行,所以 Filter 在 Interceptor 之前执行。
 * 3. Filter 拦截的是一个具体的请求;而 Interceptor 拦截的是处理器。
 */
@Component
public class MyInterceptor implements HandlerInterceptor {
    /**
     * 当处理器的执行被拦截下来之后,如果这个方法返回 true,就表示继续去执行处理器,如果这个方法返回 false,就表示处理器不执行了
     * @param request
     * @param response
     * @param handler 这个就是处理器本身 HandlerMethod
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        return true;
    }

    /**
     * 这个方法是在处理器执行之后执行
     * @param request
     * @param response
     * @param handler
     * @param modelAndView 处理器执行完毕之后,就会返回 ModelAndView,所以这个参数其实就是处理器返回的 ModelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }

    /**
     * 这个是页面渲染完成后执行
     * @param request
     * @param response
     * @param handler
     * @param ex 渲染出错的异常
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}

再到xml文件中配置:

<mvc:interceptors>
        <mvc:interceptor>
            <!--配置拦截器,设置 myInterceptor 这个拦截器可以拦截所有请求-->
            <mvc:mapping path="/**"/>
            <ref bean="myInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

Ajax跨域的问题解决:

       使用注解解决


@RestController
public class HelloController {

    @GetMapping("/hello")
    //@CrossOrigin(origins = "http://localhost:8081")  表示允许处理来自 8081 这个接口的请求,本质上就是在响应头中添加一个 Access-Control-Allow-Origin 字段
    @CrossOrigin(origins = "http://localhost:8081")
    public String show(){
//        int i = 1/0;
        return "hello";
    }

    @PutMapping("/hello2")
    
    @CrossOrigin(origins = "http://localhost:8081")
    public String hello2() {
        return "hello put";
    }
}

         使用xml文件解决

<!--一键解决跨域问题-->
    <mvc:cors>
        <mvc:mapping path="/**" allowed-origins="http://localhost:8081" allowed-methods="*"/>
    </mvc:cors>

相关文章:

  • 安卓手机使用Tasker实现应用级功能,屏幕翻译v9,翻译复制贴图
  • 一篇文章吃透 CSS3 属性: transition过渡 与 transform动画
  • 通讯录的动态版本
  • Docker搭建Kafka集群
  • WPS增加正则处理函数,简直如虎添翼
  • opencloudos容器镜像优化
  • 二.go语言条件与循环
  • 高阶函数1
  • 电子信息考研择校
  • 互联网数据管理平台
  • 本科行政管理毕业论文什么题目好写点?
  • kmp の 笔记
  • 最新网站证书提示风险的原因和几个解决方法
  • lambda表达式(C++11)
  • java计算机毕业设计图书共享系统源代码+数据库+系统+lw文档
  • [deviceone开发]-do_Webview的基本示例
  • 「面试题」如何实现一个圣杯布局?
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 3.7、@ResponseBody 和 @RestController
  • C++类中的特殊成员函数
  • flask接收请求并推入栈
  • Intervention/image 图片处理扩展包的安装和使用
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Redis 中的布隆过滤器
  • Selenium实战教程系列(二)---元素定位
  • Spring Boot MyBatis配置多种数据库
  • Terraform入门 - 3. 变更基础设施
  • 大型网站性能监测、分析与优化常见问题QA
  • 关于字符编码你应该知道的事情
  • 回流、重绘及其优化
  • 京东美团研发面经
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 使用common-codec进行md5加密
  • 我的面试准备过程--容器(更新中)
  • 赢得Docker挑战最佳实践
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • #etcd#安装时出错
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • $L^p$ 调和函数恒为零
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (4) PIVOT 和 UPIVOT 的使用
  • (备忘)Java Map 遍历
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (分布式缓存)Redis持久化
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (转载)深入super,看Python如何解决钻石继承难题
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .NET Core WebAPI中封装Swagger配置
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题