开发者学堂课程【Filte(过滤器)、Listener(监听器):Filter 的应用场景、Filter 的目标资源、小结】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/38/detail/878
Filter 的应用场景、Filter 的目标资源、小结
内容介绍
一、过滤器的应用场景。
二、案例分类。
三、设置目标资源。
四、Filter mapping 的子元素。
五、Filter小结。
一、过滤器的应用场景。
1、执行目标资源之前做预处理工作,例如设置编码,这种试通常都会放行 ,只是在目标资源执行之前做一些准备工作。
(批注:几乎所有的 Servlet 中都需要写request.setCharacterEndoing()可以把它写到一个Filter中。)
(过滤器不会做拦截操作,只是设置编码。)
2、通过条件判断是否放行,例如校验当前用户是否已经登录,或者用户IP是否已经被禁用。(有拦截操作,判断Id是否在禁用区域。)
3、在目标资源执行后,做一些后续的特殊处理工作,例如把目标资源输出的数据进行处理。(批注:回程拦截!)
二、案例分类。
1、分IP统计访问次数:第一种预处理。
2、粗粒度权限控制:资源分为三个等级。如在淘宝中,为游客、会员、管理员,可以访问商品不可查询订单为游客等级,既可以访问商品又可查询订单的为会员等级,可以调价格的为管理员等级。
这属于第二种通过条件判断。
3、解决全站字符乱码:第一种预处理 。
4、页面静态化:第三种回程拦截,做后续处理。
三、设置目标资源。
在web.xml文件中部署Fiter时, 可以通过“*”来执行目标资源:
这一特性与Servlet完全相同!通过这一特性,我们可以在用户访问敏感资源时,执行过滤器,例如:admin/*可以把所有管理员才能访问的资源放到/admin路径下,这时可以通过过滤器来校验用户身份。
还可以为filter-mapping〉指定目标资源为某个Servlet,例如:
< filter-mapping>
myfilter
/*
批注:/*表示过滤所有资源
< servlet>
< servlet-name>
myservlet
< servlet-class
> cn.itcast.servlet.MyServlet
< servlet-name>
myservlet
< servlet-
name
>
/abc
>
<
s
evlet-mapping
>
> myfilter< /filter-name>
< filter-class
>
cn.itcaat.
filter.
MyFilterilter
-class>
< filter-mapping>
myfilter
'
<
servlet-name >
m
yservlet
servlet-name)
mapping>
批注: <
servlet-name >
m
yservlet
servlet-name)
这里没有指定< url-patter>,而是指定< server-name>!注意,它与某个 servlet 的配置名称相同!
当用户访问http: localhost:8080/filtertest/abc时,会执行名字为 myservlet 的servlet ,这时会执行过滤器。
注:serlet-name 指定方式可以有多个。
四、Filter-mapping 的子元素。
;
;
;
。
五、Filter 小结。
1、filter 的三个方法。
①void init (filterConfig):在 Tomcat 启动时被调用;
②void destroy(): 在 Tomcat 关闭时被调用;
③void doFitertServletRequest,ServletResponse,FterChain):每次有请求时都调用该方法。
2、FilterConfig类: 与 ServletConfig 相似,用来获取 Fiter 的初始化参数。
①ServletContext getServletContext(): 获取 ServletContext 的方法;
②String getFiterName):获取 Fiter 的配置名称;
③string getnitParametert(string name):获取Fiter的初始化配置,与〈init-param〉元素对应;
④Enumeration getinitParameterNames(): 获取所有初始化参数的名称。
3、FRerChain 类
void doFiter(ServletRequest,ServletResponse):放行!表示执行下一个过滤器,或者执行目标资源,可以在调用 FiltetChain 的 doFiter()方法的前后添加语句,在FilterChain的dofiter()方法之后的语句会在目标资源执行之后执行。
4、四种拦截方式 :REQUEST,FORWARD,INCLUDE,ERROR,默认是 REQUEST 方式。
①REQUEST:拦截直接请求方式;
②FORWARD:拦截请求转发方式 ;
③INCLUDE:拦截请求包含方式;
④ERROR:拦截错误转发方式。