SpringMVC中的拦截器和Servlet中的过滤器效果类似,都是在Controller前面后者后面做一些事情,但是两者也有一些区别:
- 过滤器可以应用于所有的web技术, 包括SpringMVC,但是拦截器是SpringMVC中的东西,只能用于该框架
- 过滤器可以拦截所有请求,包括静态资源如:html,css等。拦截器不可以
拦截器的原理很简单,通过一张图来描述:
当请求到达后,会首先经过拦截器,拦截器会执行预处理方法,然后放行将请求发送到Controller,Controller方法执行后,会先经过拦截器的后处理方法,然后返回页面,加载页面完成后,还会执行拦截器页面加载后的方法。所以,总共有三个方法,执行的位置需要搞清楚。
自定义一个拦截器首先需要写一个类,实现HandlerInterceptor接口,实现三个上面所说的方法
public class MyInterceptor implements HandlerInterceptor {
//预处理 true表示放行,false表示不放行
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("拦截器执行了...preHandle");
return true;
}
//后处理
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器执行了...postHandle");
}
//页面加载完成处理
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("拦截器执行了...afterCompletion");
}
}
然后在配置文件中配置该拦截器
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/*"/>
<bean id="myInterceptor" class="test.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
最后定义 Controller方法
@Controller
@RequestMapping("/user")
public class InterceptorController {
@RequestMapping("testInterceptor")
public String testInterceptor() {
System.out.println("testInterceptor执行了");
return "success";
}
}
在页面上编写控制台输出,使得结果能明显一点:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>success</title>
</head>
<body>
<%
System.out.println("success页面执行了");
%>
</body>
</html>
执行,查看结果:
拦截器链的就是配置多个拦截器,配置的方法相同,只不过需要注意顺序