美文网首页
过滤器 - 拦截器 - 监听器

过滤器 - 拦截器 - 监听器

作者: 冷月成双 | 来源:发表于2020-03-04 16:55 被阅读0次

    过滤器 拦截器 监听器

    过滤器

    实现

    实现Filter类,然后重写它的3个方法:

    • init 方法 : 在容器中创建当前过滤器的时候自动调用这个方法

    • destory 方法 : 在容器中销毁当前过滤器的时候自动调用这个方法

    • doFilter 方法 : 这个方法有3个参数,分别是 ServletRequest,ServletResponseFilterChain.可以在参数中获取 HttpServletRequestHttpServletResponse对象进行相应的处理操作.

    在springboot项目中使用filter ,自定义MyFilter类:

    import lombok.extern.slf4j.Slf4j;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import java.io.IOException;
    
    @Slf4j
    public class MyFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            log.info("init 方法被调用");
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
            log.info("doFilter 方法被调用");
            HttpServletRequest httpServletRequest = (HttpServletRequest)request;
            String s = httpServletRequest.getRequestURL().toString();
            log.info("url : "+s);
            filterChain.doFilter(request,response);
        }
    
        @Override
        public void destroy() {
            log.info("destroy 方法被调用");
        }
    }
    

    然后在添加到filterChain

    @Configuration
    public class WebAppConfigurer implements WebMvcConfigurer {
        @Bean
        public FilterRegistrationBean filterRegist(){
            FilterRegistrationBean frBean = new FilterRegistrationBean();
            frBean.setFilter(new MyFilter());
            frBean.addUrlPatterns("/*");
            return  frBean;
        }
    }
    

    init 方法在项目启动的时候会调用

    doFilter 方法在每次请求的时候会调用

    过滤器也可以配合@WebFilter@ServletComponentScan使用,详情参见@WebFilter

    拦截器

    java中拦截器是动态拦截action调用的对象,然后提供可以在action执行前后增加一些操作,也可以在action执行前停止操作.拦截器可以做和过滤器同样的操作

    springBoot 中使用拦截器

    @Slf4j
    @Component
    public class LoginHandlerInterceptor implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
           log.info(" preHandle 方法");
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
           log.info(" postHandle 方法");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
           log.info(" afterCompletion 方法");
        }
    }
    
    @Configuration
    public class WebAppConfigurer implements WebMvcConfigurer {
        @Bean
        public LoginHandlerInterceptor loginHandlerInterceptor(){ return new LoginHandlerInterceptor();}
        
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            List<String> excludes = new ArrayList<>();
            excludes.add("/api/**");
            excludes.add("/js/**");
            excludes.add("/css/**");
            excludes.add("/img/**");
            excludes.add("/lib/**");
            excludes.add("/fonts/**");
      registry.addInterceptor(loginHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns(excludes);
        }
    }
    

    监听器

    监听器通常用于监听Web应用中对象的创建,销毁等动作的发生,同时对监听的情况作出相应的处理,最常用于统计网站的在线人数,访问量等信息

    • ServletContextListener : 用来监听ServletContext属性的操作,比如新增修改删除
    • HttpSessionListener : 用来监听Web应用中的Session对象,常用于统计在线情况
    • ServletRequestListener : 用来监听Request对象的属性操作

    使用监听器需要在类中实现对应功能的监听器对象,例如实现 HttpSessionListener 类

    import lombok.extern.slf4j.Slf4j;
    
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
    
    @Slf4j
    public class MyHttpSessionListener implements HttpSessionListener {
    
        private static int online = 0;
    
        @Override
        public void sessionCreated(HttpSessionEvent event){
            log.info("sessionCreated 方法");
            online++;
            log.info("online : "+online);
        }
    
        @Override
        public void sessionDestroyed(HttpSessionEvent se) {
            log.info("sessionDestroyed 方法");
            online--;
            log.info("online : "+online);
        }
    }
    
    
    @Configuration
    public class WebAppConfigurer implements WebMvcConfigurer {
        @Bean
        public ServletListenerRegistrationBean listenerRegistrationBean(){
            ServletListenerRegistrationBean srb = new ServletListenerRegistrationBean();
            srb.setListener(new MyHttpSessionListener());
            return srb;
        }
    }
    

    监听器可以在MyHttpSessionListener类上添加注解@WebListener,并且在启动类上加上@ServletComponentScan这样就不用在WebAppConfigurer配置类中配置了

    import javax.servlet.annotation.WebListener;
    
    @WebListener
    @Slf4j
    public class MyHttpSessionListener implements HttpSessionListener {
        private static int online = 0;
          @Override
        public void sessionCreated(HttpSessionEvent event){
            log.info("sessionCreated 方法");
            online++;
            log.info("online : "+online);
        }
    
        @Override
        public void sessionDestroyed(HttpSessionEvent se) {
            log.info("sessionDestroyed 方法");
            online--;
            log.info("online : "+online);
        }
    }
    

    本篇文章由一文多发平台ArtiPub自动发布

    相关文章

      网友评论

          本文标题:过滤器 - 拦截器 - 监听器

          本文链接:https://www.haomeiwen.com/subject/vqjblhtx.html