1、拦截器的配置
-
拦截器用于拦截控制器方法的执行
-
拦截器需要实现HandlerInterceptor
-
拦截器必须在SpringMVC的配置文件中进行配置
1.1 和1.2 是对所有的请求进行拦截;1.3 对排出的请求不在拦截
1.1 不使用注解的情况
创建拦截器类
/**
* 拦截器
* @author zyz
* @version 1.0
* @data 2022/12/18 14:15
* @Description:
*/
public class FirstInterceptor implements HandlerInterceptor {
/**
* 方法执行前
* CTRL+O 重写的快捷键
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("FirstInterceptor--->:preHandle");
/**
* 如果返回false、视图页面不出效果,由源码得知、走到一般返回了。没有到视图解析那一步
*/
return true;
}
/**
* 方法执行后
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("FirstInterceptor--->:postHandle");
}
/**
* 视图渲染后执行
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@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.zyz.mvc.interceptors.FirstInterceptor"/>
</mvc:interceptors>
1.2 使用注解的方式
只需要在拦截器类上添加注解@Component
。
@Component
public class FirstInterceptor implements HandlerInterceptor {
在配置文件中使用
<!--配置拦截器-->
<mvc:interceptors>
<ref bean="firstInterceptor"/>
</mvc:interceptors>
1.3 自定义拦截
/*拦截当前目录下的请求。/**拦截所有的请求。这里的
exclude-mapping
表示排除拦截
<!--
以上配置方式可以通过ref或bean标签设置拦截器,通过mvc:mapping设置需要拦截的请求,
通过mvc:exclude-mapping设置需要排除的请求,即不需要拦截的请求
-->
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*"/>
<mvc:exclude-mapping path="/"/>
<ref bean="firstInterceptor"></ref>
</mvc:interceptor>
</mvc:interceptors>
2、拦截器的三个抽象方法
SpringMVC中的拦截器有三个抽象方法:
-
preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法
-
postHandle:控制器方法执行之后执行postHandle()
-
afterComplation:处理完视图和模型数据,渲染视图完毕之后执行afterComplation()
3、多个拦截器的执行顺序
-
若每个拦截器的preHandle()都返回true,此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关:preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()会按照配置的反序执行
-
若某个拦截器的preHandle()返回了false,preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false的拦截器之前的拦截器的afterComplation()会执行
至于为啥是反序执行、根据源码可知是通过i-- 的形式
配置文件中配置拦截器、可以通过普通的bean也可以通过注解形式
<!--配置拦截器-->
<mvc:interceptors>
<bean class="com.zyz.mvc.interceptors.FirstInterceptor"/>
<bean class="com.zyz.mvc.interceptors.SecondInterceptor"/>
</mvc:interceptors>
preHandle()都返回true的时候
preHandle()都返回有一个为false的时候