IT修真院·小课堂丨互联网职业小课堂在线学习平台

课堂课题:

拦截器、过滤器、监听器各有什么作用?

关联任务:

任务五

直播时间:

2019-06-17 15:30:00


课堂内容:

视频链接:

PPT链接:

提交按钮:

小课堂内容格式


标题:

【修真院xx(职业)小课堂】课题名称

开场语:

大家好,我是IT修真院XX分院第X期的学员XX,一枚正直纯洁善良的XX程序员,今天给大家分享一下,修真院官网XX(职业)任务X,深度思考中的知识点——XXX

(1)背景介绍:

背景介绍的时候,尽可能的要宽广,讲清楚来龙去脉,讲清楚为什么会需要这个技术。

(2)知识剖析:

讲知识点的时候,尽可能的成体系,学会成体系的去给别人介绍知识。现在很多做的都是零散的,没有分类。

(3)常见问题:

最少列出1个常见问题。

(4)解决方案:

写清楚常见问题的解决方案。

(5)编码实战:

尽可能的去寻找在真实项目中在用的。如果你能找到某个网站在用你说的知识点,这是最好的。学以致用,否则当成练习题就没有意义了。多准备一些demo,讲解过程中将知识点和demo结合,便于大家理解所讲解的知识点。

(6)拓展思考:

知识点之外的拓展思考,由分享人进行讲解,这些东西就是所谓的深度,也是一个人技术水准高低比较的表现。

(7)参考文献:

引入参加文献的时候,在引用的句子后面加上序号【1】。参考文献中列出详细来源。不要去抄别人的东西,这是一个基本的态度。

(8)更多讨论:

Q1:提问人:问题?
A1:回答人(可以是分享人,也可以是其他学员):回答
Q2:提问人:问题?
A2:回答人(可以是分享人,也可以是其他学员):回答
Q3:提问人:问题?
A3:回答人(可以是分享人,也可以是其他学员):回答

(9)鸣谢:

感谢XX、XX师兄,此教程是在他们之前技术分享的基础上完善而成。

(10)结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

拦截器、过滤器、监听器各有什么作用?     中品

辅导师兄


大家好,我是IT修真院郑州分院第15期的学员,一枚正直纯洁善良的后端程序员。

今天给大家分享一下,修真院官网java(职业)任务1,深度思考中的知识点—— 拦截器、过滤器、监听器各有什么作用?

1.背景介绍

 拦截器

拦截器是在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。拦截器不是在web.xml配置的,比如struts在struts.xml配置,在springMVC在spring与springMVC整合的配置文件中配置。

过滤器

Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可以进行逻辑判断,如用户是否已经登录、有没有权限访问该页面等等工作,它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关的请求,只有当你的web应用停止或重新部署的时候才能销毁。

监听器

web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如ServletContext,HttpSession,ServletRequest的创建和销毁;变量的创建、销毁和修改等。可以在某些动作前后增加处理,实现监控。

2.知识剖析

过滤器的原理

Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:

调用目标资源之前,让一段代码执行。

是否调用目标资源(即是否让用户访问web资源)。

调用目标资源之后,让一段代码执行。

web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问,否则web资源不会被访问。

过滤器的使用

第一步创建一个类实现Filter接口

第二步重写接口中方法  doFilter方法是真正过滤的。

第三步呢就是我们需要在web.xml中配置过滤器的路径。

监听器的种类

ServletContext相关监听器:1.ServletContextListener:主要用于监听ServletContext即Servlet容器的创建与销毁。2.ServletContextAttributeListener:主要用于监听ServletContext作用域中属性的变化。

ServletRequest相关监听器:1.ServletRequestListener:主要用于监听request对象的创建与销毁。

2.ServletRequestAttributeListener:主要用于监听request作用域中属性的变化。

HttpSession相关监听器:1.HttpSessionListener:用于监听session对象的创建与销毁。

2.HttpSessionAttributeListener:用户监听session作用域中属性的变化。

3.HttpSessionBindingListener:由实体类实现,不需要注册,用于监听实体对象添加到session作用域与从session作用域中删除的事件。

4.HttpSessionActivationListener:实体类在实现该接口的同时必须实现Serializable接口,实体类对象必须保存在session作用域中。用于监听实体类对象被序列化与反序列化的事件。

监听器的用途

利用HttpSessionLisener统计在线人数

利用ServletContextListener加载初始化信息

统计网站访问量

实现访问监控

拦截器的使用

第一步:自定义一个实现了Interceptor接口的类,或者继承抽象类AbstractInterceptor。重写相应的preHandle(...)、postHandle(...)和afterCompletion(...)方法

第二步:在springMVC.xml配置文件中注册定义的拦截器。

第三步:在需要使用Action中引用上述定义的拦截器,为了方便也可以将拦截器定义为默认的拦截器,这样在不加特殊说明的情况下,所有的Action都被这个拦截器拦截。

拦截器的方法

(1)preHandle 方法将在请求处理之前进行调用。所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值Boolean 类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法。(2)postHandle 方法,顾名思义就是在当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。

(3)afterCompletion法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。

3.常见问题和解决方案

1、过滤器和拦截器的区别?

①拦截器基于java的反射机制,而过滤器是基于函数回调。

②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,在拦截器里注入一个service,可以调用业务逻辑。

2、拦截器、过滤器、监听器的执行顺序

监听器 > 过滤器 > 拦截器 > servlet执行 > 拦截器 > 过滤器 > 监听器

4.编码实战

5.扩展思考

1、多个拦截器的执行顺序(两个为例)

(1)当俩个拦截器都实现放行操作时,顺序为preHandle 1,preHandle 2,postHandle 2,postHandle 1,afterCompletion 2,afterCompletion 1;

(2)当第一个拦截器preHandle返回false,也就是对其进行拦截时,第二个拦截器是完全不执行的,第一个拦截器只执行preHandle部分;

(3)当第一个拦截器preHandle返回true,第二个拦截器preHandle返回false,顺序为preHandle 1,preHandle 2 ,afterCompletion 1。

2、多个过滤器的执行顺序

web服务器根据Filter在web.xml中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法,在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第二个filter,如果没有,则调用目标资源。

3、多个监听器的执行顺序

一个webServlet里面若有多个监听器的话,顺序是按照加载的顺序来加载和注册的这些servlet监听器的。

6.参考文献

https://www.cnblogs.com/CloverSH/p/4531492.html#3674958

https://www.cnblogs.com/hellovoyager1/p/9152292.html

7.更多讨论

1.过滤器和监听器可以采用@bean的方式注入吗?

可以,过滤器和监听器都可以用@Bean的方式注入,然后使用listenerRegister和filterRegister的方式进行注册。

2.拦截器和过滤器拦截成功之后怎么返回结果呢

一般这里我们采用重定向的方法,转向另一个请求。

3.Servlet3中异步处理指的是什么

很多的请求将会被堆积起来而后续的请求可能会遭遇拒绝服务,直到有资源可以处理请求为止。异步特性可以帮助应用节省容器中的线程,特别适合执行时间长而且 用户需要得到结果的任务,如果用户不需要得到结果则直接将一个Runnable对象交给Executor(如果不清楚请查看前文关于多线程和线程池的部 分)并立即返回即可。

8.结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~


评论

[郑州|结业弟子]JAVA-李雨航 发表于 2019-07-05 19:42:17 #1

内容很充实,讲的有点紧张,放开点

回复

请您登录 后进行评论