拦截器与过滤器区别
制作拦截器功能
配置拦截器的执行位置
①声明拦截器的bean,并实现HandlerInterceptor接口(注意:扫描加载bean)
@Component
public class ProjectInterceptor implements HandlerInterceptor {public boolean preHandle( ...) throws Exception {System.out.println( "preHandle.. . " );return true;//控制拦截是否放行}public void postHandle( ...) throws Exception {System.out.println( "postHandle.. . " );}public void afterCompletion( ...) throws Exception {System.out.println( "afterCompletion. . ." );}
}
②定义配置类,继承WebMvcConfigurationSupport,实现addInterceptor方法(注意:扫描加载配置)
@Configuration
public class SpringMvcSupport extends webMvcConfigurationSupport {@Overridepublic void addInterceptors( InterceptorRegistry registry) {...}
}
③添加拦截器并设定拦截的访问路径,路径可以通过可变参数设置多个
@Configuration
public class SpringMvcSupport extends webMvcConfigurationSupport {@Autowiredprivate ProjectInterceptor projectInterceptor;@overridepublic void addInterceptors(InterceptorRegistry registry) {registry,addInterceptor(projectInterceptor).addPathPatterns("/books");}
}
④也可以使用标准接口WebMvcConfigurer简化开发(注意:侵入式较强)
@Configuration
@ComponentScan( "com.itheima.controller" )
@EnableWebMvC
public class SpringMvcConfig implements webMvcConfigurer{@Autowiredprivate ProjectInterceptor projectInterceptor;@Overridepublic void addInterceptors (InterceptorRegistry registry){registry.addInterceptor(projectInterceptor).addPathPatterns ("/books", "/books/*");}
}
前置处理
public boolean preHandle(HttpServletRequest request,HttpServletResponse response,0bject handler) throws Exception {System.out.println( "preHandle... " );return true;
}
参数
返回值
后置处理
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndview modelAndView) throws Exception {System.out.println( "postHandle..." );
}
参数
完成后处理
public void aftercompletion(HttpServletRequest request, HttpServletResponse response,object handler, Exception ex) throws Exception {System.out.print1n("afterCompletion. . ." );
}
参数
多拦截器执行顺序
当配置多个拦截器时,形成拦截器链
拦截器链的运行顺序参照拦截器添加顺序为准
当拦截器中出现对原始处理器的拦截,后面的拦截器均终止运行
当拦截器运行中断,仅运行配置在前面的拦截器的afterCompletion
操作