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()会执行。
标签:控制器,拦截器,preHandle,postHandle,SpringMVC,使用,执行 From: https://www.cnblogs.com/lisong0626/p/17999308