• Java框架 SpringMVC--拦截器与异常处理器


    1、拦截器

    1.1、拦截器的配置

    SpringMVC中的拦截器用于拦截控制器方法的执行
    SpringMVC中的拦截器需要实现HandlerInterceptor
    SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置:
    1. <mvc:interceptors>
    2. <mvc:interceptor>
    3. <mvc:mapping path="/**"/>
    4. <mvc:exclude-mapping path="/abc"/>
    5. <ref bean="firstInterceptor"/>
    6. mvc:interceptor>
    7. mvc:interceptors>

    代码示例:

    index.html 代码:

    1. <head>
    2. <meta charset="UTF-8">
    3. <title>首页title>
    4. head>
    5. <body>
    6. <h1>首页h1>
    7. <a th:href="@{/test/hello}">测试拦截器a>
    8. body>

    success.html 代码:

    1. <head>
    2. <meta charset="UTF-8">
    3. <title>成功title>
    4. head>
    5. <body>
    6. <h1>Hello Worldh1>
    7. body>

    控制层代码:

    1. @Controller
    2. public class TestController {
    3. @RequestMapping("/test/hello")
    4. public String testHello() {
    5. return "success";
    6. }
    7. }
    拦截器代码:实现接口并实现方法
    1. @Component
    2. public class FirstInterceptor implements HandlerInterceptor {
    3. @Override
    4. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    5. System.out.println("FirstInterceptor --> preHandle");
    6. return true;
    7. }
    8. @Override
    9. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    10. System.out.println("FirstInterceptor --> postHandle");
    11. }
    12. @Override
    13. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    14. System.out.println("FirstInterceptor --> afterCompletion");
    15. }
    16. }

    结果:点击首页中的超链接

     

    1.2、拦截器的三个抽象方法

    SpringMVC中的拦截器有三个抽象方法:
            preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法
            postHandle:控制器方法执行之后执行postHandle()
            afterCompletion:处理完视图和模型数据,渲染视图完毕之后执行afterCompletion()

    1.3、多个拦截器的执行顺序

    ① 若每个拦截器的preHandle()都返回true

            此时多个拦截器的执行顺序和拦截器在SpringMVC 的配置文件的配置顺序有关:
            preHandle()会按照配置的顺序执行,而postHandle()afterCompletion()会按照配置的反序执行
    代码示例:
    FirstInterceptor.java:
    1. @Component
    2. public class FirstInterceptor implements HandlerInterceptor {
    3. @Override
    4. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    5. System.out.println("FirstInterceptor --> preHandle");
    6. return true;
    7. }
    8. @Override
    9. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    10. System.out.println("FirstInterceptor --> postHandle");
    11. }
    12. @Override
    13. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    14. System.out.println("FirstInterceptor --> afterCompletion");
    15. }
    16. }

    SecondInterceptor.java

    1. @Component
    2. public class SecondInterceptor implements HandlerInterceptor {
    3. @Override
    4. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    5. throws Exception {
    6. System.out.println("SecondInterceptor --> preHandle");
    7. return true;
    8. }
    9. @Override
    10. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
    11. throws Exception {
    12. System.out.println("SecondInterceptor --> postHandle");
    13. }
    14. @Override
    15. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
    16. throws Exception {
    17. System.out.println("SecondInterceptor --> afterCompletion");
    18. }
    19. }

    springmvc.xml:

    1. <mvc:interceptors>
    2. <ref bean="firstInterceptor"/>
    3. <ref bean="secondInterceptor"/>
    4. mvc:interceptors>

    结果:点击首页中的超链接:

    ② 若某个拦截器的preHandle()返回了false

            preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false的拦截器之前的拦截器的afterCompletion()会执行
    示例:
    修改代码:

     结果:点击首页中的超链接:

     

    2、异常处理器

    2.1、基于配置的异常处理

            SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口: HandlerExceptionResolver
            HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver和 SimpleMappingExceptionResolver
    SpringMVC提供了自定义的异常处理器SimpleMappingExceptionResolver,使用方式:
    1. <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    2. <property name="exceptionMappings">
    3. <props >
    4. <prop key="java.lang.ArithmeticException">errorprop>
    5. props>
    6. property>
    7. <property name="exceptionAttribute" value="ex"/>
    8. bean>

    代码示例:

    创建页面 error.html:

    1. <head>
    2. <meta charset="UTF-8">
    3. <title>错误title>
    4. head>
    5. <body>
    6. <h1>ERRORh1>
    7. <h2 th:text="${ex}">h2>
    8. body>

    修改控制器方法:

    1. @RequestMapping("/test/hello")
    2. public String testHello() {
    3. System.out.println(1 / 0);
    4. return "success";
    5. }

    结果:点击首页中的超链接:

     

    2.2、基于注解的异常处理

    1. // @ControllerAdvice 将当前类标识为异常处理的组件
    2. @ControllerAdvice
    3. public class ExceptionController {
    4. // @ExceptionHandler用于设置所标识方法处理的异常(数组)
    5. @ExceptionHandler(ArithmeticException.class)
    6. public String handleArithmeticException(Exception exception,Model model) {
    7. // 将异常信息保存到 Request 域中
    8. model.addAttribute("ex", exception);
    9. return "error";
    10. }
    11. }
    结果同上
     

  • 相关阅读:
    传统语音增强——基本的维纳滤波语音降噪算法
    有了低代码,二次开发都不是事!
    ResourceQuota对象在K8s上的说明
    词对齐任务:端到端模型
    Spring MVC
    详解 Java 19 中的记录类型的模式匹配
    【算法】顺序表力扣OJ
    面向大规模队列,百万并发的多优先级消费系统设计
    NC65 rest接口 开发 NC65接口开发
    C语言实现——简易通讯录
  • 原文地址:https://blog.csdn.net/weixin_65637841/article/details/126475103