首先简单明确下概念:
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()