拦截器
过滤器
拦截器
拦截器链
1. 过滤器与拦截器的比较
- 过滤器是servlet规范中的一部分,任何Java web工程都可使用;拦截器是SpringMVC自己的,只能在SpringMVC工程中使用。
- 过滤器可以对所有要访问的资源拦截;拦截器只能拦截访问的Controller方法,如果访问的是jsp、html、css、image、js不会拦截。
2. 开发步骤
- 编写拦截器类,实现HandlerInterceptor接口
- 配置拦截器
注:jdk 1.8允许编写接口时实现接口中的方法,这样在实现接口时就可不用实现方法。如此处用到的HandlerInterceptor接口,实现该接口可以不用实现接口内定义的方法。
3. 拦截器实现
- 编写拦截器类,实现HandlerInterceptor接口
package cn.itcast.interceptor;
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 {
/**
* preHandle:预处理,Controller中的方法执行前执行
* @param request
* @param response
* @param handler
* @return true: 放行,执行下一个拦截器的preHandle方法,如果没有下一个拦截器,执行Controller中的方法
* false: 不放行,可以通过request和response对象进行页面的跳转
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor1 preHandle running...");
return true;
}
/**
* postHandle:后处理,Controller中的方法执行后执行
* 当postHandler和Controller中的方法都有跳转时,跳转的页面是postHandler中指定跳转的页面,但Controller中要跳转的页面也会执行
* @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("MyInterceptor1 postHandle running...");
}
/**
* afterCompletion:页面跳转后执行
* @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("MyInterceptor1 afterCompletion running...");
}
}
- 配置拦截器
<!-- 配置拦截器(可以有多个)-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 要拦截的Controller中的方法,除了配置的方法以外的其他方法都不拦截-->
<mvc:mapping path="/test/*"/>
<!-- 不拦截的Controller中的方法,除了配置的方法以外的其他方法都拦截-->
<!-- <mvc:exclude-mapping path="/test/*"/>-->
<!-- 拦截到指定的方法后调用的拦截器,也就是自定义的拦截器-->
<bean class="cn.itcast.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
查看当前类的父类和实现接口的方法
Ctrl + o
Ctrl+N 搜索指定类
查看当前接口的所有实现类快捷键:idea查看接口的所有实现类及类图