1、拦截器和过滤器区别
1)、过滤器是基于servlet的一种函数回调,依赖servlet容器
2)、拦截器是基于java反射机制,不依赖servlet容器
3)、拦截器只能对action请求起作用,而过滤器则对几乎所有的请求起作用
4)、拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问
5)、在action的生命周期中,拦截器可以多次被调用,而过滤器只能被调用一次
6)、拦截器可以获取IOC容器中的各个bean,而过滤器不行,在拦截器里注入一个service,可以调用对应的业务逻辑
7)、拦截器是spring容器的,是spring支持的,过滤器不是
2、触发时机:
1)、过滤器是在请求进入容器后,但请求进入serlvet之前进行预处理的。请求结束返回也是,在servlet处理之后,返回给前端之前
- 总结:过滤器包裹住servlet,servlet包裹住拦截器
3、过滤器核心方法:实现(Filter)接口
//初始化
void init(FilterConfig filterConfig);
//调用过滤器处理
void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("before...");
chain.doFilter(request, response);
System.out.println("after...");
}
//销毁
void destroy();
4、拦截器核心方法:——>继承(HandlerInterceptorAdapter)类 -->实现HandlerInterceptor接口
//前置操作在业务处理器处理请求之前被调用
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {
System.out.println("preHandle");
return true;
}
//在业务处理器处理请求完成之后,生成视图之前执行
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
//在DispatcherServlet完全处理完请求之后被调用,可用于清理资源
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("afterCompletion");
}
a.preHandle()这个方法是在过滤器的chain.doFilter(request, response)方法的前一步执行,也就是在 [System.out.println("before...")][chain.doFilter(request, response)]之间执行。
b.preHandle()方法之后,在return ModelAndView之前进行,可以操控Controller的ModelAndView内容。
c.afterCompletion()方法是在过滤器返回给前端前一步执行,也就是在[chain.doFilter(request, response)][System.out.println("after...")]之间执行。
5、SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。所以过滤器、拦截器、service()方法,dispatch()方法的执行顺序应该是这样