【归纳总结】SpringMVC之HandlerInterceptor

CharacterEncodingFilter

为了解决数据的中文乱码问题,需要引入Filter来设置编解码格式

在web.xml文件中进行如下配置:

    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <!--调用set方法-->
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

HandlerInterceptor

它的功能类似于Filter,是拦截器

通过handlerMapping生成了handlerExecutionChain(执行链,也就是执行计划),包含了handlerList<HandlerInterceptor>

简单来说,就是按照计划(顺序)执行handler和handlerInterceptor的中方法。

1️⃣ HandlerInterceptor的使用

第一步

编写一个类继承HandlerInterceptor接口,可选择性地重写接口中的三个方法preHandle、postHandle、afterCompletion

三个方法与handler方法的执行顺序如下:
在这里插入图片描述

① preHandle(预处理)
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return false;
    }
   

返回一个boolean的值

  • 为true则表示可以继续后续的方法
  • 为false则表示不能继续后续的方法
② postHandle(后处理)
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

方法的参数modelAndView是handler方法执行完响应的modelAndView
如果响应的是json数据,那么modelAndView的值为null

这个方法可以对modelAndView做一些额外的处理

③ afterCompletion
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }

只要当前的HandlerInterceptor的preHandler方法的返回值为true,就一定可以执行该HandlerInterceptor的afterCompletion方法

第二步

在application.xml中进行配置,注册为interceptor(拦截器),并可以在此指定他的范围

① 全局

DispatcherServlet作用范围下的全部Handler

可以使用id或者使用全类名来配置

    <mvc:interceptors>
        <!--
            如果使用bean标签或ref标签的话,作用范围是全局
            全局:DispatcherServlet作用范围下的全局
        -->
        <ref bean="customHandlerInterceptor"/>
        <!--<bean class="com.cskaoyan.interceptor.CustomHandlerInterceptor"/>-->
    </mvc:interceptors>
② 局部

配置一个mapping,在path属性中指定路径
对特定的url起作用

        <mvc:interceptor>
            <!--
                /hello → hello这个请求
                /hello* → helloxxx请求
                /hello/* → hello/xxx请求
                /hello/** → hello以及hello的所有多级请求 /hello/aaa/bbb/ccc
            -->
            <mvc:mapping path="/hello/**"/>
            <ref bean="customHandlerInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

也可以在配置类中进行配置:

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        InterceptorRegistration registration = registry.addInterceptor(new MyInterceptor());
        registration.addPathPatterns("/**");

    }
}

2️⃣ 多个interceptor的执行顺序

类似于栈,先进后出,即先执行preHandle方法的,后执行postHandle方法和afterCompletion方法

执行顺序体现在配置文件中:

    <mvc:interceptors>
        <!--顺序和书写顺序相关-->
        <ref bean="handlerInterceptor1"/>
        <ref bean="handlerInterceptor2"/>
        <ref bean="handlerInterceptor3"/>
    </mvc:interceptors>

在这里插入图片描述
如果有某个preHandle方法的返回值为false则会中断流程,但如果在此prehandle方法之前执行的prehandle方法的返回值为ture,则会执行与这些prehandle方法相对应的afterComletion方法

例如:如果preHandle1返回值为false
在这里插入图片描述
如果:preHandle2返回值为false
在这里插入图片描述
如果:preHandle3返回值为false在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值