springboot (2.0) 设置监听器,过滤器,拦截器
github:springboot2.0
项目名:springboot-filter
1.项目结构和配置顺序
1.1配置顺序
listener
- @WebListener声明为listen类
- @ServletComponentScan开启需要扫描的listener类文件,相当于listener启动类
- implements ServletContextListener 接口,重写contextInitialized(初始化时启动),contextDestroyed(销毁时启动)。
filter
- @WebFilter配置过滤器名和url策略
- implement filter接口,并重写方法init(初始化),doFilter(调用时),destory(销毁时)。
interceptor
- @component 声明为注入类
- implements HandleIntercept 接口并重写preHandle(请求处理前),postHandle(请求处理后),afterCompletion(渲染视图后,用于资源清理)
- @Configuration 配置拦截器启动类,extends WebMvcConfigurationSupport实体并重写addInterceptors(配置拦截器url),addResourceHandlers(配置拦截器静态资源),记得生成interceptor实例调用(重要)
2.配置文件
mylistener
@WebListener
@ServletComponentScan("com.plumblum.servlet")
public class MyListener implements ServletContextListener {
private static Logger LOG = LoggerFactory.getLogger(MyListener.class);
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
LOG.info("myListener 初始化...");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
LOG.info("myListener 销毁...");
}
}
myfilter
//过滤的请求不会经过controller层
@WebFilter(filterName="MyFilter",urlPatterns="/getAll/*")
public class MyFilter implements Filter {
private static Logger logger = LoggerFactory.getLogger(MyFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.info("初始化过滤器");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
String requestURI = req.getRequestURI();
logger.info("过滤到的请求--->"+requestURI);
}
@Override
public void destroy() {
}
}
myinterceptor
@Component
public class MyInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println(">>>MyInterceptor>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(">>>MyInterceptor>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(">>>MyInterceptor>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet");
// 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
}
}
配置interceptor启动类
//拦截器配置类
@Configuration
public class MyWebMvcConfigurerAdapter extends WebMvcConfigurationSupport {
// 配置拦截器实体(很重要)
@Bean
MyInterceptor myInterceptor(){
return new MyInterceptor();
}
// 配置拦截器url
@Override
public void addInterceptors(InterceptorRegistry registry) {
//addPathPatterns 用于添加拦截规则
//excludePathPatterns 用于排除拦截
registry.addInterceptor(myInterceptor()).addPathPatterns("/*");
// .excludePathPatterns("/hello/getAll");
super.addInterceptors(registry);
}
/**
* 配置静态资源
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
System.out.println("配置不拦截静态资源");
// registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
super.addResourceHandlers(registry);
}
}
3.启动测试结果
4.执行流程和对比图
4.1执行流程