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

课堂课题:

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

关联任务:

任务五

直播时间:

2018-12-24 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)结束语:

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

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

辅导师兄 [西安|荣耀师兄]JAVA-郭靖


 大家好,我是IT修真院西安分院第4期的学员鲁伯良,一枚正直纯洁善良的java程序员,今天给大家分享一下,修真院官网java任务5,深度思考中的知识点——拦截器,监听器,过滤器各有什么作用?

   

1.背景介绍

在讲解三大器之前,我们需要对Servlet 有所了解,因为这个通常是我们在接触Javaweb 时最先了解到的知识点

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程(三个重要方法):

①init () 方法进行初始化:

 在Servlet的生命周期中,仅执行一次init()方法,它是在服务器装入Servlet时执行的,可以配置服务器,以在启动服务器或客户机首次访问Servlet 时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init();

②Servlet 调用 service() 方法来处理客户端的请求:

它是Servlet的核心,每当一个客户请求一个HttpServlet 对象,该对象的Service() 方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet 中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。

③Servlet 通过调用 destroy() 方法终止(结束):

仅执行一次,在服务器端停止且卸载Servlet 时执行该方法,有点类似于C++ delete 方法。一个Servlet 在运行service() 方法时可能会产生其他的线程,因此需要确认在调用destroy() 方法时,这些线程已经终止或完成。

Servlet 的生命周期的话还需要加上在init() 之前有一个加载和实例化Servlet(反射机制)的过程。

2.知识剖析

拦截器

1  拦截器的概念

java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action

执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截

然后再之前或者之后加入某些操作。目前,我们需要掌握的主要是Spring的拦截器,Struts2的拦截器不用深究,知道即可。

2,拦截器的原理<br>

1、拦截请求的url;

2、从cookie中获取token;

3、如果没有token,则直接拦截,打回登录页面;

4、获取到token,调用sso(单点登录)系统的服务查询用户信息,返回session(用户信息);

5、对获取到的session进行处理。如果session已经过期直接打回系统登录页面;如果session有效,则直接放行,达到用户的请求页面

3.拦截器的实现

第一步:自定义一个实现了Interceptor接口的类,或者继承抽象类AbstractInterceptor。

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

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

 Action都被这个拦截器拦截。

生活中的拦截器

 比如说京东,在我们搜索东西的时候是不需要我们的个人信息的,但是当我们提交订单或者查看个人订单的时候,肯定会走拦截器判断的用户信息真实有效性的。大家可以做个试验,京东提交订单结束后进入支付页面前后,分别清除浏览器缓存,进行刷新,我们是会被打回登录页面的。再者像现在的淘宝,连浏览都要求登陆,这里利用的都是拦截器,简单来说,就是我们每进入一个设置好有拦截要求的页面,这个东西都系都会走一遍,不符合条件或者不安全了,直接打回登陆页面。

再就是权限要求了。

过滤器

过滤器简介

Filter也称之为过滤器,它是Servlet技术中最激动人心的技术之一,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,

 Servlet, 静态图片文件或静态html文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等

一些高级功能。

Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter

技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截

过滤器的原理

 Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,

 都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:

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

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

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

 web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个

 doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问,

否则web资源不会被访问。

过滤器的实现

* 编写java类实现Filter接口,并实现其doFilter方法。

* 在web.xml 文件中使用(filter)和(filter-mapping)元素对编写的filter类进行注册,并设置它所能拦截的资源。

Filter链

在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。web服务器根据Filter在web.xml文件中的注册顺序,

 决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter

方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,

如果没有,则调用目标资源。

Filter的生命周期

  Filter的创建

 Filter的创建和销毁由web服务器负责。 web应用程序启动时,web服务器将创建Filter的实例对象,并调用其init方法,完成对象的初始化

 功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前

  filter配置信息的FilterConfig对象。

  Filter的销毁

 web容器调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。

 FilterConfig接口

 用户在配置filter时,可以使用(init-param)为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了

 filter初始化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得:

 String getFilterName():得到filter的名称。

 String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.

 Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。

 public ServletContext getServletContext():返回Servlet上下文对象的引用。

监听器

1  监听器

 当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。

 例如:创建一个“人”类Class Person

 人拥有吃的方法public void eat(){},我们的目的就是,在这个人吃之前要提醒他洗手,所以我们就要监听这个人,不管他在什么时候吃,我们都要能够监听到并且提醒他洗手,通俗点讲这个就是监听器的作用(在吃之前提醒他洗手)。

2.组成:

  2.1Java的时间监听机制涉及到三个组件:事件源、事件监听器、事件对象

  2.2当事件源上发生操作时,它会调用事件监听器的一个方法,并且调用这个方法时,会传递事件对象过来

  2.3事件监听器是由开发人员编写,开发人员在事件监听器中,通过事件对象可以拿到事件源,从而对事件源上的操作进行处理

3.实现:

 3.1创建一个人类,人具有跑、吃的方法  (创建一个事件源)

 3.2创建一个接口用来监视人的跑、吃   (事件监听器)

 3.3创建一个事件对象,里面用来封装人(Person)这个对象  (事件对象)

 3.4创建一个测试类,用来测试Java监听机制

3.常见问题

过滤器和拦截器的区别

4.解决方案

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

 2 、拦截器不依赖与servlet容器,过滤器依赖与servlet容器 .

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

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

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

6.扩展思考

java三大器的使用场景

过滤器应用案例

拦截器

1、日志记录 :记录请求信息的日志

 2、权限检查,如登录检查

 3、性能检测:检测方法的执行时间

监听器

最常见的监听在线人数

参考文献

1. 【JavaWeb 三大器--Listener、Filter 和Interceptor 总结】

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

                    2. 【拦截器的原理实现】

                    https://www.cnblogs.com/DoubleEggs/p/6112119.html

                    3. 【Java三大器之拦截器(Interceptor)的实现原理及代码示例】

                    https://blog.csdn.net/reggergdsg/article/details/52962774/ww

更多讨论

郭靖:为什么说过滤器只调用一次?

鲁伯良: Filter的创建和销毁由web服务器负责。 web应用程序启动时,web服务器将创建Filter的实例对象,并调用其init方法,完成对象的初始化

 功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前

  filter配置信息的FilterConfig对象。

郭靖:拦截器和过滤器有什么区别?

鲁伯良:1 、拦截器是基于java的反射机制的,而过滤器是基于函数回调。 

 2 、拦截器不依赖与servlet容器,过滤器依赖与servlet容器 .

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

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

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

Q3:监听器有什么用?

A3:当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。

结束语:

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


评论

[西安|荣耀师兄]JAVA-郭靖 发表于 2019-01-02 13:25:48 #1

讲的还可以了,最好是有一些自己的理解,结合代码实现,这样效果会更好一些。

回复

请您登录 后进行评论