github地址: https://github.com/lishanglei/filter-interceptor.git
拦截器是基于java的反射机制,而过滤器是基于函数回调
拦截器不依赖于servlet容器,过滤器依赖于servlet容器拦截器只能对action请求起作用,过滤器几乎对所有请求都起左右拦截器可以访问action上下文,值栈里的对象,而过滤器不能访问在action’的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次拦截器可以获取IOC容器中的各个bean,而过滤器不行,在拦截器中注入一个service,可以调用业务逻辑 1.过滤器时请求进入容器,但请求进入servlet容器之前进行预处理,请求结束返回时,实在servlet处理之后,返回前端之前.过滤器包裹住servlet,servlet包裹住拦截器
2.过滤器的触发时机是容器后,servlet之前,所以过滤器的doFilter(
ServletRequest request ,ServletResponse response)的入参是ServletRequest 和ServletResponse
3.过滤器是javaEE标准,采用函数回调的方式进行.是在请求进入WEB容器之后,还未进入servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理.
//过滤器 public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { if (Globals.IS_SECURITY_ENABLED) { final ServletRequest req = request; final ServletResponse res = response; try { AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() { public Void run() throws ServletException, IOException { ApplicationFilterChain.this.internalDoFilter(req, res); return null; } }); } catch (PrivilegedActionException var7) { Exception e = var7.getException(); if (e instanceof ServletException) { throw (ServletException)e; } if (e instanceof IOException) { throw (IOException)e; } if (e instanceof RuntimeException) { throw (RuntimeException)e; } throw new ServletException(e.getMessage(), e); } } else { this.internalDoFilter(request, response); } } //拦截器 public interface HandlerInterceptor { default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { } default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { } } preHandle()这个方法是在过滤器的chain.doFilter(ServletRequest,ServletResponse)方法的前一步执行,也就是在[System.out.printlin(“before****”)]和[chain.doFilter(request,response)]之间执行.该方法将在请求处理之前进行调用,如果已经是最后一个Interceptor的时候就会调用当前请求的Controller方法.postHandler()方法是在return ModelAndView之前进行,可以操控Controller的ModelAndView内容,当前请求进行处理之后,也就是Controller方法调用执行的,但是它会在DispacterServlet进行视图返回渲染之前被调用.所以我们可以在这个方法中对controller处理之后的ModelAndView对象进行操作.postHandler()被调用的方向和preHandler相反,也就是说先声明的Interceptor的post Handler()反而会后执行afterCompletion()方法是在过滤器返回给前端前一步执行,也就是在[chain.doFilter(request,response)]和[System.out.println(“after”)]之间执行,该方法将在整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行.这个方法的主要作用是进行资源清理工作. 4.SpringMvc的机制是由同一个servlet来分发请求到不同的controller,其实这一步实在servlet的service() 方法中执行的.
5.拦截器是spring容器的,是spring支持的