介绍
SpringMVC拦截器类似于Servlet开发中的过滤器Filter,它可以对处理器进行预处理和后处理。
拦截器与过滤器的区别
(1)任何java web工程都可使用过滤器,而拦截器只有SpringMVC框架的工程才可使用;
(2)过滤器可以通过url-pattern配置成/*后对所有要访问的资源进行拦截,而拦截器只能拦截访问的控制器方法,jsp,html,css,js等是不会被拦截的。
预处理
允许放行示例
自定义拦截器类
public class MyInterceptor implements HandlerInterceptor {
/*
执行前控制层方法 先执行预处理方法
返回true表示放行,执行下一个拦截i去,若没有拦截器则执行控制层方法
返回false表示不放心,可通过request或response进行页面跳转
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle方法执行");
// return true;
request.getRequestDispatcher("/WEB-INF/views/error.jsp").forward(request, response);
return false;
}
}
在springmvc.xml配置拦截器
<!-- 配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 设置具体要拦截的方法,此处拦截Intercept下的所有方法-->
<mvc:mapping path="/Intercept/**"/>
<bean class="com.on1.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
控制层类
@Controller
@RequestMapping("/Intercept")
public class InterceptController {
@RequestMapping("/testIntercept")
public String testIntercept() {
System.out.println("testIntercept方法执行");
return "success";
}
}
请求链接:
<a href="Intercept/testIntercept">测试拦截方法</a>
点击链接后的页面:

控制台输出:

不允许放行示例
修改下preHandle方法:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle方法执行");
request.getRequestDispatcher("/WEB-INF/views/error.jsp").forward(request, response);
return false;
}
点击链接后页面:

控制台输出:

后处理
postHandle方法:在控制层方法执行完逻辑并要跳转页面之前执行该方法。 示例
拦截器类
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle方法执行");
return true;
}
/*
当控制层类方法testIntercept执行完且要跳转到success页面之前执行postHandle方法
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle方法执行");
request.getRequestDispatcher("/WEB-INF/views/error.jsp").forward(request, response);
}
}
点击链接后页面为:


完成后
afterCompletion方法:在控制层方法执行完逻辑并跳转页面后,执行该方法,主要用于回收资源。
示例
拦截器类
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle方法执行");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle方法执行");
request.getRequestDispatcher("/WEB-INF/views/error.jsp").forward(request, response);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion方法执行");
}
}
点击链接后页面为:

控制台输出:

注:若注释掉postHandle方法中跳转到error页面的语句,则最终是跳到success页面。