SpringMVC--09异常处理器与拦截器

异常处理器

自定义的异常处理器

自定义异常处理器需要使用SimpleMappingExceptionResolver类

可以通过XML配置文件或者注解的方式进行设置

配置文件方式:springmvc.xml

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <!-- 可以配置多个键值对,key是异常,要提供具体的异常类型,包括包名 -->
            <!-- 这里的配置表名只要出现了异常就跳转到tip视图 -->
            <prop key="java.lang.Exception">tip</prop>
        </props>
    </property>
    <!-- 将异常信息存储到request域,value属性用来指定存储时的key -->
    <property name="exceptionAttribute" value="e" />
</bean>

注解方式

    @ControllerAdvice
    public class ExceptionController{
        @ExceptionHandler
        public String tip(Exception e,Model model){
            model.addAttribute("e",e);
            return "tip"
        }
    }

拦截器

概述

Spring MVC的拦截器作用是在请求到达控制器前或之后进行拦截,可以对请求和响应进行特定处理

拦截器和过滤器的区别

  • 过滤器更注重在请求和响应的流程中进行处理,可以修改请求和响应的内容,列如设置编码和字符集、请求头、状态码等(属于servlet)
  • 拦截器更加侧重于对控制器进行前置或后置处理,在请求达到控制器之前或之后进行特定的操作,列如打印日志,权限认证(属于Spring MVC)

执行顺序
filter-DispatcherServlet-interceptor-Controller-interceptor-DispatcherServlet-filter

拦截器的创建与基本配置

实现org.springframework.web.servlet.HandlerInterceptor接口,选择性实现方法

  • perHandle:处理器方法调用之前执行
    • 只有该方法有返回值,返回值是布尔类型,true放行,false拦截
  • postHandle:处理器方法调用之后执行
  • afterCompletion:渲染完成后执行

springmvc.xml

<!-- 配置拦截器 -->
<mvc:interceptors>
    <!-- 基本配置:方式1 -->
    <!-- 基本配置会拦截所有的请求 -->
    <!-- <bean class="com.atli.interceptors.Interceptor1" /> -->
    <!-- 基本配置:方式2,需要对拦截器使用@Component注解 -->
    <ref bean="interceptor1" />
</mvc:interceptors>

com.atli.interceptors.Interceptor1

@Component
public class Interceptor1 implements HandlerInterceptor{
    @Override
    public boolean perHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception{
        System.out.println("Interceptor1's perHandle");
    }
    @Override
    public boolean postHandle(HttpServletRequest request, HttpServletResponse response,Object handler ,ModelAndView modelAndView) throws Exception{
        System.out.println("Interceptor1's postHandle");
    }
    @Override
    public boolean afterCompletion(HttpServletRequest request, HttpServletResponse response,Object handler ,Exception ex) throws Exception{
        System.out.println("Interceptor1's afterCompletion");
    }
}

拦截器的高级配置

springmvc.xml

<mvc:interceptors>
    <mvc:interceptor>
        <!-- 拦截所有路径 -->
        <mvc:mapping path="/**" />
        <!-- 不拦截/test路径 -->
        <mvc:exclude-mapping path="/teest" />
        <!-- 拦截器 -->
        <ref bean="interceptor1">
    </mvc:interceptor>
</mvc:interceptors>

拦截器的执行顺序

如果拦截器的preHandle都返回true则会根据配置文件中顺序进行拦截

这里假设有三个拦截器分别是A,B,C,它们同时作用于处理器方法X,那么其执行顺序为:preHandle(A->B->C)->X->postHandle(C->B->A)->渲染页面->afterCompletion(C->B->A)

如果拦截器的preHandle存在返回false,那么该拦截器和后续拦截器的postHandle和afterCompletion均不会执行,且所有的postHandle,处理器方法都不会被执行

同样的使用上面的例子,不过B的preHandle返回false
preHandle(A->B)->afterCompletion(A)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值