过滤器拦截器监听器和springboot实现

本文详细介绍了Filter过滤器、Interceptor拦截器和Listener监听器的概念及应用。Filter主要用于Web程序,实现URL级别的权限访问控制等功能;Interceptor则适用于Spring框架,实现事务管理和权限检查等;Listener则用于监听Web应用中的特定事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先简单明确下概念:

Filter 过滤器  Servlet规定,Servlet容器支持,只用于web程序,只在servlet前后作用

 属于Servlet技术,对web服务器管理的所有web资源:Jsp, Servlet, 
 静态图片文件或静态html文件等进行拦截,
 实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

 Filter组合起来称之为一个Filter链。web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个 Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法

Filter功能
 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest 。
 根据需要检查HttpServletRequest,也可以修改HttpServletRequest 头和数据。
 在HttpServletResponse到达客户端之前,拦截HttpServletResponse 。
 根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。


Interceptor  拦截器 spring容器内spring框架支持,可用于appliacation程序
 是spring组件可使用spring任何资源对象事务管理等,通过IOC注入到拦截器


Interceptor  功能:拦截器用于对处理器进行预处理和后处理。
        1、日志记录:记录请求信息的日志,进行信息监控、信息统计、计算Page View等。
 2、权限检查:如登录检测,检测是否登录,如果没有直接返回到登录页面;
 3、性能监控:通过拦截器在进入处理器之前记录开始时间,处理完后记录结束时间.

 4、通用行为:读取cookie得到用户信息并将用户对象放入请求

Listener 监听器:Servlet中的特殊的类,监听web中的特定事件,比如ServletContext,HttpSession,ServletRequest的创建和销毁;变量的创建、销毁和修改等。可以在某些动作前后增加处理,实现监控

Listener功能:

 1、统计在线人数,利用HttpSessionLisener
 2、加载初始化信息:利用ServletContextListener
 3、统计网站访问量
 


拦截器的方法(核心)

        拦截器可深入方法前后,异常前后,spring架构中优先使用
 #1.preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器

  返回值:true表示继续流程,调用下一个拦或处器);false表示流程中断,此时我们需要通过response来产生响应;

 #2.postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模  型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。

 #3.afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间 并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返 回true的拦截器的afterCompletion。


requset经过:过滤器拦截器的流程

context-param -> listener -> filter -> servlet->Interceptor->filter 
请求发出
 --过滤器执行(do.filter(req,rep)之前)
  --servlet的service方法<springMVC的doService方法>
  --DispatchServlet映射处理
  --拦截器preHandle--控制器
  --拦截器postHandle(处理器的后处理,渲染视图<return mv>之前)
  --视图解析器--jsp(页面渲染)
 - -拦截器afterCompletion(视图渲染完毕时回调方法<return之后,filter返给客户端之前>)
 --过滤器之后(do.filter(req,rep)之后)
客户端加载视图


SpringBoot中的实现

* @过滤器使用步骤,比较简单
*  1,编写相应的servlet 并加上注解
*  2,需启动ServletComponentScan注解
过滤器filter:
Class  MyFilter  implements  javax.servlet.Filter(Srq req,Srp rsp,FilterChain fc){

 Init{}//初始化方法

 doService{  //执行操作方法
  Sout(“before”)
  Fc.doChain(req,rsp);
  Sout(“after”)

 }

 Destory{}  //销毁方法
}


*@拦截器使用步骤
* 一,写一个拦截器,实现HandlerInterceptor接口
* 二,写一个类,继承WebMvcConfigurerAdapter抽象类,重写addInterceptors方法,调用registry.addInterceptor(拦截器)

拦截器Interceptor:
Class  Myinterceptor  implements  HandlerInterceptor{
//Controller之前调用
 Boolean prehandler(httpsre  hq, httpsrq  hp, Object o){

 Sout(“---”+o.getClass)  }

//Controller之后,渲染页面之前调用
 postHandler(httpsre  hq, httpsrq  hp, Object o,Mv mv){

 Sout(“---”+hq.getRequestUrl) }

渲染页面之后调用,用于资源清理
 afterCompletion(httpsre  hq, httpsrq  hp, Object o,Mv mv){
 Sout(“---”+hq.getRequestUrl) }
}

//重写addInterceptors方法,注册拦截器
Class  MyWebMvcConfigurerAdapter  extends WebMvcConfigurerAdapter{
 Void addInterceptors(InterceptorRegistry registry){
 Registry.addInterceptors(new MyMyinterceptor  .addPathPatterns(“/my/*”));
 }
}

* @监听器使用步骤
*      1,自定义事件 一般继承ApplicationEvent抽象类
*      2,定义事件监听器 一般实现ApplicationListener<>接口
*      3,启动时把监听器装配到spring容器,@Component 或app.addListeners()或@@EventListener或 context.listener.class配置项 或spring.factories机制
*      4,发布事件,context.publishEvent();

监听器listener:

//自定义事件

Class  MyApplicationEvent extends ApplicationEvent{

 public MyApplicationEvent(Object resource){super(resource)}
  }

//自定义监听器
Class  Mylistener implements ApplicationListener<Mylistener>{
     void onApplicationEvent(MyApplicationEvent myAppEvent){
 sout(“=========myApplicationEvent===========”);}
}

//springboot启动主方法里添加监听器,并且发布事件
  SpringApplication app=new SpringApplication ();
  app.addListeners();
  ConfigurableApplicationContext context=app.run(AppApplication.class,args);
  context.publishEvent()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值