一、拦截器
(一)拦截器的配置
- SpringMVC中的拦截器用于拦截控制器方法的执行。
- SpringMVC中的拦截器需要实现HandlerInterceptor。
- SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置(下文介绍)。
(二)拦截器的三个抽象方法
- SpringMVC中的拦截器有三个抽象方法:
preHandle()
:控制器方法执行之前执行preHandle()
,其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法。postHandle()
: 控制器方法执行之后执行postHandle()
。afterCompletion()
: 处理完视图和模型数据,渲染视图完毕之后执行afterCompletion()
。
于是我们可以知道,当preHandle()
里的返回值为false时,postHandle()
和afterCompletion()
都不会执行,因为控制器方法被拦截了,而它们都是在控制器方法之后。
案例:
自定义拦截器类:
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstInterceptor implements HandlerInterceptor {
//拦截器中有三个抽象方法可以重写
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("FirstInterceptor的preHandle()方法执行了");
return false;
}
@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的afterCompletion()方法执行了");
}
}
springmvc配置文件:
方式一:
<mvc:interceptors>
<bean class="com.fox.mvc.interceptor.FirstInterceptor"></bean>
</mvc:interceptors>
方式二:
在拦截器类上面加上@Component注解后:
<!-- 自动扫描包 -->
<context:component-scan base-package="com.fox.mvc"/>
<mvc:interceptors>
<ref bean="firstInterceptor"></ref>
</mvc:interceptors>
以上两种配置方式都是对DispatcherServlet所处理的所有的请求进行拦截。
方式三:
可以设置对哪些请求拦截,哪些不拦截。
<mvc:interceptors>
<mvc:interceptor>
<!--可以通过ref或bean标签设置拦截器,通过mvc: