走进SpringBoot之过滤器、监听器、拦截器

转载自:https://blog.csdn.net/xadjccl/article/details/82259478

 

走进SpringBoot之过滤器、监听器、拦截器

该篇主要记录SpringBoot项目中如何使用 过滤器、监听器、拦截器。关于 过滤器、监听器和拦截器有过web开发经验的 同志们都知道,在web.xml中做相对应的配置,指定实现类即可。过滤器只能再web项目中使用,拦截器则都可以。过滤器和拦截器主要可以实现请求过滤,例如我们web项目判断一个请求之前要先拦截判断,是都有权限来访问,session中是否有登录过的标志等等功能。


过滤器

1.首先创建一个SpringBoot项目。创建一个MyFilter  实现接口Filter

    @WebFilter(filterName = "myFilter",urlPatterns = {"/*"})
    public class MyFilter implements Filter {
     
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            // TODO Auto-generated method stub
            System.out.println("MyFilter init ");
        }
     
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            // TODO Auto-generated method stub
            HttpServletRequest req = (HttpServletRequest) request;
            System.out.println("MyFilter doFilter"+req.getParameter("name"));
            chain.doFilter(request, response);
            return ;
        }
     
        @Override
        public void destroy() {
            // TODO Auto-generated method stub
            System.out.println("MyFilter destroy");
        }
    }

在该类上添加注解

@WebFilter(filterName = "myFilter",urlPatterns = {"/*"})

 指定过滤器的名称和要过滤的地址。

2.在入口的启动类上添加注解

    @SpringBootApplication
    @ServletComponentScan
    public class FilterSpringBootApplication {
        public static void main(String[] args) {
            SpringApplication.run(FilterSpringBootApplication.class, args);
        }
    }

  启动项目可以在启动的日志中看见

 过滤器已经初始化了。

3.编写controller: FilterController

    @Controller
    public class FilterController {
        @RequestMapping("/testMyFilter")
        public String testMyFilter() {
            return "Hello Filter";
        }
    }

 重启项目,访问http://127.0.0.1:8080/testMyFilter?name=ccl

控制台输出正确。

至此,一个过滤器就可以使用了,但是在我们平常的工作中一般有多个过滤器,并且要指定每个过滤器的顺序等等,那么用这种方式是没有办法 实现的,可以使用FilterRegistrationBean 来实现

1.将上面项目的 过滤器上的@WebFilter(filterName = "myFilter",urlPatterns = {"/*"}) 去掉,将入口类的@ServletComponentScan去掉。

2.根据之前 的做饭做法再编写一个过滤器: MyFilterTwo

    public class MyFilterTwo implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            // TODO Auto-generated method stub
            System.out.println("MyFilterTwo init ");
        }
     
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            // TODO Auto-generated method stub
            HttpServletRequest req = (HttpServletRequest) request;
            System.out.println("MyFilterTwo doFilter"+req.getParameter("name"));
            chain.doFilter(request, response);
            return ;
        }
     
        @Override
        public void destroy() {
            // TODO Auto-generated method stub
            System.out.println("MyFilterTwo destroy");
        }
    }

 

3. 编写java配置文件FilterConfig

     @Configuration
    public class FilterConfig {
        @Bean
        public FilterRegistrationBean filterRegistrationBean() {
            FilterRegistrationBean filterRegistrationBean =
                    new FilterRegistrationBean();
            filterRegistrationBean.setFilter(new MyFilter());
            //指定过滤器的执行顺序
            filterRegistrationBean.setOrder(2);
            filterRegistrationBean.addUrlPatterns("/*");
            return filterRegistrationBean;
        }
        @Bean
        public FilterRegistrationBean filterRegistrationBean2() {
            FilterRegistrationBean filterRegistrationBean =
                    new FilterRegistrationBean();
            filterRegistrationBean.setFilter(new MyFilterTwo());
            filterRegistrationBean.setOrder(1);
            filterRegistrationBean.addUrlPatterns("/*");
            return filterRegistrationBean;
        }
    }

 然后启动项目

过滤器初始化成功

访问http://127.0.0.1:8080/testMyFilter?name=ccl

执行成功,且顺序和设置的一致。

 
监听器

监听器主要是对对象自身的创建和销毁进行监听

主要有ServletContextListener、HttpSessionListener、ServletRequestListener,用法基本一致

下面以HttpSessionListener为例,用来监听 统计当前访问人数。

1.首先创建一个CountListener实现HttpSessionListener

    public class CountListener implements HttpSessionListener  {
        private int count = 0;
        @Override
        public void sessionCreated(HttpSessionEvent se) {
            // TODO Auto-generated method stub
            count++;
            se.getSession().getServletContext().setAttribute("count", count);
            System.out.println("新增在线人数,当前在线人数:"+count);
        }
     
        @Override
        public void sessionDestroyed(HttpSessionEvent se) {
            // TODO Auto-generated method stub
            count--;
            se.getSession().getServletContext().setAttribute("count", count);
            System.out.println("删减在线人数,当前在线人数:"+count);
        }
    }

2.创建配置文件类,注册该监听器

    @Configuration
    public class ListenerConfig {
        @Bean
        public ServletListenerRegistrationBean<CountListener>
            countListenerServletRegistrationBean(){
            return new ServletListenerRegistrationBean<CountListener>(
                    new CountListener());
        }
    }

3.创建controller

    @RestController
    public class ListenerConterller {
        @RequestMapping("/testListenerLogin")
        public String testListenerLogin(HttpServletRequest req) {
            System.out.println("当前在线人数"+req.getSession().getId()+":"
                    +req.getSession().getServletContext().getAttribute("count"));
            return "Hello testListenerLogin";
        }
    }

启动项目 访问http://127.0.0.1:8080/testListenerLogin 可以看见

再 开启一个浏览器访问上述地址

得到我们想要的效果,  当然HttpSessionListener除了创建和销毁方法还有一些其他的方法可以实现。

上面使用java配置文件注册的方式注册监听器,当然还有更简单的,直接使用注解

1.在CountListener类上添加@WebListener注解,标记为监听器

    @WebListener
    public class CountListener implements HttpSessionListener  {
        private int count = 0;
        @Override
        public void sessionCreated(HttpSessionEvent se) {
            // TODO Auto-generated method stub
            count++;
            se.getSession().getServletContext().setAttribute("count", count);
            System.out.println("新增在线人数,当前在线人数:"+count);
        }
     
        @Override
        public void sessionDestroyed(HttpSessionEvent se) {
            // TODO Auto-generated method stub
            count--;
            se.getSession().getServletContext().setAttribute("count", count);
            System.out.println("删减在线人数,当前在线人数:"+count);
        }
    }

 2.在项目的启动类上添加注解@ServletComponentScan扫描

    @SpringBootApplication
    @ServletComponentScan
    public class ListenerSpringBootApplication {
        public static void main(String[] args) {
            SpringApplication.run(ListenerSpringBootApplication.class, args);
        }
    }

一样启动项目,用两个浏览器访问 http://127.0.0.1:8080/testListenerLogin  可以看见和之前是一样的效果

 
拦截器

 拦截器和过滤器的功能类似,但是是不同的东西

过滤器只能在web项目中使用, 拦截器可以在非web项目中使用。

过滤器是servlet容器支持的,拦截器是spring支持的,所以拦截器可以使用spring的资源,例如数据源,可以注入的对象等等,而过滤器是不行的。

过滤器只在servlet前后起作用,但是拦截器可以深入 到方法前后等等,功能更强大,所以再spring中要优先使用拦截器

.1.首先创建一个项目,创建一个类MyInterceptor 实现HandlerInterceptor

    @Component
    public class MyInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            // TODO Auto-generated method stub
            System.out.println("preHandle....");
            return true;
        }
     
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                ModelAndView modelAndView) throws Exception {
            // TODO Auto-generated method stub
            System.out.println("postHandle....");
        }
     
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
                throws Exception {
            // TODO Auto-generated method stub
            System.out.println("postHandle....");
        }
    }

 2.创建java配置类InterceptorConfig 继承WebMvcConfigurerAdapter

    @Configuration
    public class InterceptorConfig extends WebMvcConfigurerAdapter{
        @Autowired
        MyInterceptor myInterceptor;
        @Override
         public void addInterceptors(InterceptorRegistry registry) {
             //注册拦截器 拦截规则
            //多个拦截器时 以此添加 执行顺序按添加顺序
            registry.addInterceptor(myInterceptor).addPathPatterns("/*");
         }
    }

3.创建controller .

    @Controller
    public class InterceptorCotroller {
        @RequestMapping("/testinterceptor")
        public ModelAndView testInterceptor() {
            System.out.println("进入controller");
            ModelAndView mv = new ModelAndView();
            mv.setViewName("aaa");
            System.out.println("即将返回modelandview");
            return mv;
        }
    }
---------------------
作者:xadjccl
来源:CSDN
原文:https://blog.csdn.net/xadjccl/article/details/82259478
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值