自定义拦截器
- 示例:自定义拦截器
package mao.shu.springmvc.interceptor;
import org.springframework.web.
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
/**
* 在DispatcherServlet调用业务方法前执行
* 如果该方法返回false,则不会调用业务方法
* 也不会调用其他的拦截器
*
*
*/
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("[MyInterceptor ] preHandle");
return true;
}
//在业务方法执行时,业务方法还未返回时调用
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("[MyInterceptor ] postHandle");
}
//在业务方法返回之后调用
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("[MyInterceptor ] afterCompletion");
}
}
- 自定义的拦截器需要在SpringMVC的配置文件中配置
<mvc:interceptors>
<!--配置自定义的拦截器-->
<bean id="myInterceptor" class="mao.shu.springmvc.interceptor.MyInterceptor"/>
</mvc:interceptors>
- 测试
- 执行请求方法后:后台输出
- 在DispatcherServlet中执行目标的业务方法(448行)前,执行了这样一个判断" if (!mappedHandler.applyPreHandle(processedRequest, response)) "
- 这个判断表示当有一个拦截器的preHandler()发那个发返回false时,直接"return"结束方法,这样就不会执行目标的业务方法了
- 打开applyPreHandle()方法,这里面会遍历每一个拦截器并执行拦截器的preHandler()方法,如果有一个拦截器的preHandler()方法返回了false,则退出循环,后面的拦截器将不会再执行
拦截器配置
- 要配置拦截器需要在<mvc:interceptors>标签的<mvc:interceptor>标签之中配置
- 配置要作用的路径使用:<mvc:mapping>标签配置
- 配置不起作用的路径使用:<mvc:exclude-mapping />标签配置
<mvc:interceptors>
<!--配置LocaleChangeInterceptor拦截器
拦截请求中的locale 参数,将locale参数内容交由SessionLocaleResolver 本地化转换器处理
-->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
<!--配置拦截器-->
<mvc:interceptor>
<!--配置拦拦截诶器作用于 "/empList" 路径-->
<mvc:mapping path="/empList" />
<!--配置拦截器不拦截 /employeeConverter 路径-->
<mvc:exclude-mapping path="/employeeConverter"/>
<!--配置自定义的拦截器-->
<bean id="myInterceptor" class="mao.shu.springmvc.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
多个拦截器方法的执行顺序
-
此时同时配置了两个自定义的拦截器
- FirstIntercepter
- SecondIntercepter
-
此时这两个拦截器的在SpringMVC的配置文件中配置如下:
- 此时FirstIntercepter 拦截器的位置在SecondInterceptor拦截器的上面
<mvc:interceptors>
<!--配置LocaleChangeInterceptor拦截器
拦截请求中的locale 参数,将locale参数内容交由SessionLocaleResolver 本地化转换器处理
-->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
<!--配置自定义的拦截器-->
<bean id="firstIntercepter" class="mao.shu.springmvc.interceptor.FirstIntercepter"/>
<bean id="secondIntercepter" class="mao.shu.springmvc.interceptor.SecondIntercepter"/>
</mvc:interceptors>
- 测试访问请求
- 每个拦截器的方法上都输出了,类名+方法名
-
此时的拦截器方法默认的执行顺序为:
- preHandle()方法:默认正序执行
- postHandle()方法:默认逆序执行
- afterCompletion()方法:默认逆序执行
-
当有个拦截器的preHandler()方法返回false的时候