JavaWeb 速通Filter
目录
一、Filter快速入门
1.基本介绍 :
Filter,过滤器,是JavaWeb的三大组件之一(Servlet 程序、Listener 监听器、Filter过滤器)。Listener和Filter本质也属于Servlet规范,但由于其独立的功能而单独作为了JavaWeb三大组件。Filter是接口,使用频率很高。Filter除了可以解决传统验证方式造成的代码冗余,功能重复的问题,还可以应用于日志操作,权限检查,事务管理等场景。
2.基本原理 :
(1) 当浏览器端向服务器端发送过来HTTP请求时,Tomcat会根据web.xml配置文件中配置的过滤器和指定过滤器的url-pattern规则——来判断当前请求是否需要走过滤器。PS : 过滤的规则可以由程序员手动指定。
(2) 如果判断不需要走过滤器,就直接访问Web资源(servlet,web静态页面等)。
(3) 如果判断需要,Tomcat就会根据业务需求进行验证,如果验证合法,就继续访问;如果验证不合法,就进行返回。PS : 具体返回的URL也可以由程序员手动指定。
(4) Tomcat在调用servlet等Web资源之前,会先进行Filter的匹配——即根据请求的URL(由req对象封装),到管理Filter的URL的容器中去匹配,若匹配成功,再去管理Filter的容器中找到对应的Filter实例,并调用它的doFilter方法;若没有匹配成功,就直接访问web资源。(联系手写Tomcat底层中用于管理servlet的两个Map容器)
3.入门实例 :
定义login.jsp页面,用于用户登录的操作,数据提交到LoginCheckServlet,若password等于233,认为是管理员登录,请求转发到administration.jsp页面(用户管理页面)。administration.jsp页面定义在target包下,定义过滤器LoginFilter,过滤规则为/target/*。
login.jsp页面代码如下 :
页面效果如下 :
LoginCheckServlet类代码如下 :
administration.jsp页面代码如下 :
页面效果如下 :
定义LoginFilter过滤器对用户的非法访问进行拦截,防止非管理员非法访问用户管理界面。LoginFilter类代码如下 :
在web.xml配置文件中配置Filter,代码如下 :
运行效果 : (如下GIF)
4.生命周期 :
(1) 当Web工程启动时,Tomcat会根据反射机制创建对应的Filter实例(一个Filter只创建一次),并放入Tomcat维护的容器中保存。
(2) Tomcat会执行对应Filter的默认无参构造器和init方法(一次HTTP请求中,init方法只会调用一次)。Filter实例会常驻内存。
(3) 在创建Filter实例时,Tomcat会同时创建一个FilterConfig对象,并通过init方法传入该对象。程序员可以通过FilterConfig对象获取到该Filter的相关配置信息。
(4) 当一个HTTP请求从客户端发来时,Tomcat会判断该HTTP请求的URL是否与某个过滤器的<url-pattern>相匹配,若匹配,就会调用对应过滤器的doFilter方法。并且,Tomcat会同时创建ServletRequest对象 和 ServletResponse对象,以及FilterChain对象,并通过doFilter方法传入。
(5) Web工程停止时,销毁Filter实例,并调用destroy方法。
二、FilterConfig和FilterChain
1.FilterConfig :
1° 基本介绍
FilterConfig是Filter过滤器的配置类。FilterConfig对象的作用是获取Filter过滤器的配置内容。
2° 应用实例
在web.xml中重新配置一个filter,web.xml代码如下 :
FilterConfig_Demo类代码如下 :
运行效果 : (如下GIF)
2.FilterChain :
1° 基本介绍
FilterChain,过滤器链。在处理某些复杂业务时,一个过滤器不够,可以设计多个过滤器共同完成过滤任务,形成过滤器链。
2° 基本原理
如下图所示 :
3° 应用实例
定义两个过滤器,分别为Filter_Demo1和Filter_Demo2,并且在web.xml配置文件中按照1--->2的顺序配置。
web.xml配置文件代码如下 :
Filter_Demo1类代码如下 :
Filter_Demo2类代码如下 :
运行效果 : (GIF)
4° 使用细节
(1) 同一次HTTP请求中,由同一线程负责通过多个Filter以及对目标资源的访问。(且多个Filter使用同一个request对象)
(2) 只有当HTTP请求的URL与配置的过滤器的url-pattern匹配时,过滤器的doFilter方法才会被执行;并且如果同一次HTTP请求中有多个Filter被匹配成功,就会顺序执行,形成一个Filter调用链。(多个Filter的执行顺序,与web.xml配置文件中配置的顺序一致)
(3) filterChain.doFilter()方法执行时,将执行下一个匹配到的过滤器的doFilter方法。如果当前过滤器之后已经没有其他匹配到的过滤器,就执行到目标资源。
System.out.println("END--------------------------------------------------------------------------------------------------------------------------------");
- 点赞
- 收藏
- 关注作者
评论(0)