四、SpringMVC拦截器

四、SpringMVC拦截器

1、拦截器HandlerInterceptor
  • SpringMVC中的拦截器类似于ServletAPI中的filter过滤器

  • 实现步骤:

    1. 编写类继承HandlerInterceptor

      @Component
      public class FirstInterceptor implements HandlerInterceptor {
          /**
           * 在控制器方法执行前执行
           * return true : 放行
           * return false : 拦截
           */
          @Override
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
              System.out.println("在控制器方法执行前执行preHandle");
              return true;
          }
          /**
           * 在控制器方法执行完执行
           */
          @Override
          public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
              System.out.println("在控制器方法执行后执行postHandle");
          }
          /**
           * 处理完视图和模型数据,渲染视图完毕之后执行afterComplation()
           */
          @Override
          public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
              System.out.println("视图跳转前执行afterCompletion");
          }
      }
      
    2. 在springMVC的核心配置文件中配置

      <!--    配置拦截器-->
          <mvc:interceptors>
      <!--        方式一:<bean class="day01.interceptor.FirstInterceptor"/> 会拦截全部的访问控制器的方法-->
      <!--        <bean class="day01.interceptor.FirstInterceptor"/>-->
      <!--        方式二:<ref bean="firstInterceptor"/> 要求:拦截器要在容器里面,同样会拦截全部的访问控制器的方法-->
      <!--        <ref bean="firstInterceptor"/>-->
      <!--        方式三:可根据情况定制需要拦截的请求 path="/**": 代表拦截全部访问控制器的方法-->
              <mvc:interceptor>
                  <mvc:mapping path="/**"/>
      <!--         <mvc:exclude-mapping path=""/> 可以设置不拦截的路径   -->
                  <mvc:exclude-mapping path="/"/>
                  <ref bean="firstInterceptor"/>
              </mvc:interceptor>
          </mvc:interceptors>
      
  • 多个拦截器的执行顺序

    • 每个拦截器的preHandle()都返回true时
      • 拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关(配置在前先执行)
      • preHandle()会按照配置的顺序执行,而postHandle() 和 afterComplation() 会按照配置的反序执行
    • 若某个拦截器的preHandle()返回了false
      • preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false的拦截器之前的afterComplation()会执行
2、异常处理Exception
  • SpringMVC提供了一个处理控制器方法执行过程中出现异常的接口:HandlerExceptionResolver

  • HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver和SimpleMappingExceptionResolver

  • 自定义异常处理器SimpleMappingExceptionResolver

    • 基于xml配置实现

      <!--    基于xml的异常处理-->
          <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
      <!--        配置异常映射-->
              <property name="exceptionMappings">
                  <props>
      <!--                properties的键表示处理器方法执行过程中出现的异常-->
      <!--                properties的值表示出现指定异常后跳转的页面,会通过视图解析进行解析-->
                      <prop key="java.lang.ArithmeticException">error</prop>
                  </props>
              </property>
      <!--        exceptionAttribute将出现的异常信息在请求域中共享-->
              <property name="exceptionAttribute" value="ex"></property>
          </bean>
      
    • 基于注解配置实现

      @ControllerAdvice//标识这是一个异常处理的组件
      public class ControllerException {
          //@ExceptionHandler用来指定该方法可以处理那些异常
          @ExceptionHandler(value = {ArithmeticException.class})
          public String controllerAdvice(Exception ex, Model model){//ex用来接收异常信息
              //将异常信息存放到request域中
              model.addAttribute("ex",ex);
              return "error";//跳转页面
          }
      }
      
3、全注解开发SpringMVC
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值