目录
一、实现原理
二、栗子
2.1 思路分析
2.2 代码展示
2.3 结果展示
三、通配符
四、多个拦截器
4.1 第一个放行,第二个不放行
4.2 两个都放行
4.3 第一个不放行,第二个则无效
一、实现原理
我们先回顾一下springMVC流程图,前置控制器向处理器映射器发请求查找处理器后,返回的是一个执行链(包括一系列的拦截器)。Spring MVC中拦截器类似于Servlet中的过滤器,用于对处理器的预处理或者后处理。其拦截器的接口是:HandlerInterceptor。
在企业开发,使用拦截器实现用户认证(用户登陆后进行身份校验拦截),用户权限拦截和方法性能监控等。
二、栗子
2.1 思路分析
方法一:
定义一个类,实现HandlerInterceptor接口。
- 定义一个类,实现HandlerInterceptor接口
- 实现接口的三个方法preHandle、postHandle、afterCompletion
- 配置核心文件dispatch-servlet.xml
preHandle:进入处理器之前执行,拦截作用。通常用于身份认证、授权。
postHandle:进入控制器之后,返回ModelAndView之前。从ModelAndView出发 ,可以传数据到页面,可以指定统一的视图,比如淘宝的菜单栏导航。
afterCompletion:控制器执行完之后。通常用于异常处理、日志处理。
方法二:
继承实现了HandlerInterceptor接口的类,比如Spring已经提供的实现了HandlerInterceptor接口的抽象类HandlerInterceptorAdapter。
2.2 代码展示
MyInterceptor.java
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("before......");
return true;//放行
// return false;//不放行
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("being......");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("after......");
}
}
dispatch-servlet.xml
<!--拦截器配置-->
<mvc:interceptors>
<!--一个拦截器-->
<mvc:interceptor>
<!--所有目录下的*.do-->
<mvc:mapping path="/**"/>
<!--登录不能拦截-->
<mvc:exclude-mapping path="/**/login.do"></mvc:exclude-mapping>
<!--new MyInterceptor()-->
<bean class="com.jc.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
2.3 结果展示
三、通配符
四、多个拦截器
MyInterceptor2.java
public class MyInterceptor2 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("before2......");
return false;//不放行
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("being2......");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("after2......");
}
}
4.1 第一个放行,第二个不放行
只要有一个不放行,就不会执行postHandle方法