6.6(SpringMVC)拦截器和异常处理

SpringMVC拦截器

  1. Springmvc中的拦截器interceptor用于对控制器controller进行预处理和后处理的技术;
  2. 可以定义拦截器链,拦截器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。
  3. 拦截器利用的是AOP思想;在控制器前后进行处理的操作
  4. 自定义拦截器,需要实现HandlerInterceptor接口

SpringMVC拦截器与过滤器区别

我们在配置过滤器的时候,实在web.xml中进行配置的

  1. 过滤器是servlet中的,任何框架都可以使用过滤器技术;
  2. 拦截器是Springmvc所独有的
  3. 过滤器设置/*可以拦截任何资源
  4. 拦截器只对控制器controller中的方法进行拦截

SpringMVC拦截器

SpringMVC中的拦截器用于拦截控制器方法的执行

SpringMVC中的拦截器需要实现HandlerInterceptor

SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置:

使用SpringMVC自定义拦截器

编写自定义拦截器类

自定义拦截器类实现HandlerInterceptor接口,重写其中三个方法之一的preHandle()方法

//自定义的拦截器实现该接口
//拦截器在Spring中特有的,类似AOP方法,在控制器方法执行前后进行处理
public class interceptorTest implements HandlerInterceptor {

//    表示control的方法执行前
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("interceptor  before");
        System.out.println("  return true ");
        return true;
    }

//    在controller中方法执行后,返回jsp视图执行之前执行此方法
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println(" as aop    befor,after in controller  ");
    }

//    跳转页面后执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println(" page success  interceptor afterMethod  ");
    }
}

SpringMVC配置拦截器

 <!--配置拦截器interceptor-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--/*表示拦截所有的请求-->
            <mvc:mapping path="/*"/>   <!--拦截的路径,路径都是controller中的方法路径-->
            <!--<mvc:exclude-mapping path="/account/testSpringmvc"/>  &lt;!&ndash;不拦截的路径&ndash;&gt;-->
            <bean class="cn.Interceptor.interceptorTest"/>  <!--指定自定义的拦截器类-->
        </mvc:interceptor>
    </mvc:interceptors>

因为我设定的拦截器拦截所有的请求。所以发送任何请求都会进行拦截操作

类似AOP,只是进行访问,调用了控制器中的方法。触发拦截器

在这里插入图片描述

HandlerInterceptor接口中的三个方法分析

preHandler()

拦截在controller中方法执行之前,执行,这是拦截器主要用到的方法

​ 可以使用request或者response跳转到指定的页面

​ return true 代表放行 return false 代表不放行

postHandler()

在controller中方法执行后,返回jsp视图执行之前执行此方法

​ 1). 可以使用request或者response跳转到指定的页面
​ 2). 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。

afterCompletion()

在跳转页面后执行此方法

无法通过request或response跳转页面了

在SpringMVC底层中Hander表示的就是控制器类。SpringMVC的执行流程中会提到

配置多个拦截器

在这里插入图片描述

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

此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关: preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()会按照配置的反序执行

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

preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false 的拦截器之前的拦截器的afterComplation()会执行

小结

拦截器,属于Spring中的。

功能类是AOP操作,在调用Controller方法的前后中进行操作。前决定是否进行放行

异常处理器

在这里插入图片描述

SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolver HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver(默认的异常处理)和 SimpleMappingExceptionResolver SpringMVC提供了自定义的异常处理器

表示在控制器方法中出现异常。会进行跳转到你指定的异常页面

在微服务架构中存在服务熔断,当服务出现错误,存在一个应急方案。有点意思但是不是同一个概念

SimpleMappingExceptionResolver,使用方式:

基于配置的操作

 <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <!--
                prop的键表示处理器方法执行过程中出现的异常
                prop的值表示若出现指定异常时,设置一个新的视图名称,跳转到指定页面
                -->
                <prop key="java.lang.ArithmeticException">error</prop>
            </props>
        </property>
        <!--
        exceptionAttribute属性设置一个属性名,将出现的异常信息在请求域中进行共享
        -->
        <property name="exceptionAttribute" value="ex"></property>
    </bean>

控制器

 @RequestMapping("/mathexception")
    public String MathException() {
//可以看到这个控制一定会出现 算数异常
        int a = 10 / 0;

        return "show";
    }

在这里插入图片描述

基于注解的异常操作

//@ControllerAdvice将当前类标识为异常处理的组件
    @ControllerAdvice
    public class ExceptionController {
        //@ExceptionHandler用于设置所标识方法处理的异常
        @ExceptionHandler(ArithmeticException.class)
//ex表示当前请求处理中出现的异常对象
        public String handleArithmeticException(Exception ex, Model model) {
            model.addAttribute("ex", ex);
            return "error";
        }


    


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值