SpringMVC拦截器的使用

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

SpringMVC配置拦截器

SpringMVC中的拦截器需要实现HandlerInterceptor接口

public class FirstInterceptor implements HandlerInterceptor {
   //该方法是在控制器方法执行前执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("FirstInterceptor->preHandle");
	//返回false执行拦截,true放行
        return HandlerInterceptor.super.preHandle(request,response,handler);
    }

   //该方法是在控制器方法执行后执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("FirstInterceptor->postHandle");
    }

   //该方法是在视图渲染后执行
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("FirstInterceptor->after");
    }
}

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

SpringMVC的拦截器三种配置方式

方式1:使用bean标签

<mvc:interceptors>
    <bean class="com.evan.interceptor.FirstInterceptor"/>
</mvc:interceptors>

方式2:引入外部bean

<bean class="com.evan.interceptor.FirstInterceptor" id="firstInterceptor"/>
<mvc:interceptors>
	<ref bean="firstInterceptor"/>
</mvc:interceptors>

方式3:使用注解方式

将拦截器的实现类注入到spring容器中

@Component //将实现类注入到容器中
public class FirstInterceptor implements HandlerInterceptor {}

开启组件扫描

<context:component-scan base-package="com.evan"/>

配置拦截器

<mvc:interceptors>
	<!-- 扫描组件从Spring容器中获取实现类对象,该对象默认是实现类的驼峰类名 -->
	<ref bean="firstInterceptor"/>
</mvc:interceptors>

结论:
以上三种方式:都是对所有请求进行拦截
bean标签和ref标签配置的拦截器默认对DispatcherServlet处理的所有的请求进行拦截或放行。

排除指定的拦截请求

<mvc:interceptors>
    <!--<bean class="com.evan.interceptor.FirstInterceptor"/>-->
    <!--<ref bean="firstInterceptor"/>-->
    <mvc:interceptor>
       <!-- 配置需要拦截的请求的请求路径,/**表示所有请求 -->
        <mvc:mapping path="/**"/>
       <!-- 配置需要排除拦截的请求的请求路径-->
        <mvc:exclude-mapping path="/test/hello"/>
        <!-- 配置拦截器 -->
        <ref bean="firstInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

多个拦截器的执行顺序

通过观察源码:
1、若每个拦截器的preHandle()都返回true,则多个拦截器的执行顺序是按照在SpringMVC配置文件的配置顺序执行。

说明:
preHandle()会按照配置的顺序执行(由上而下),而postHandle()和afterComplation()会按照配置的反序执行(由下而上)。

2、若多个拦截器中的某个拦截器的preHandle()返回false。preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false的拦截器之前的拦截器的afterComplation()会执行。

热门相关:少女斗恶龙   梦之园   新汉普夏饭店   画江湖之不良人电影版   素描少女