http:
//localhost:
8080/filtertest/b.jsp-->直接访问b.jsp时,会执行过滤器内容;
http:
//localhost:
8080/filtertest/a.jsp-->访问a.jsp,但a.jsp会forward到b.jsp,这时就不会执行过滤器!
其实过滤器有四种拦截方式!
分别是:
REQUESTFORWARDINCLUDEERROR
REQUEST直接访问目标资源时执行过滤器。
包括:
在地址栏中直接访问、表单提交、超链
接、重定向,只要在地址栏中可以看到目标资源的路径,就是REQUEST
FORWARD转发访问执行过滤器。
包括RequestDispatcher#forward()方法、<jsp:
forward>标
签都是转发访问;
INCLUDE包含访问执行过滤器。
包括RequestDispatcher#include()方法、<jsp:
include>标签
都是包含访问;
ERROR当目标资源在web.xml中配置为<error-page>中时,并且真的出现了异常,转发到目标资源时,会执行过滤器。
可以在<filter-mapping>中添加0~n个<dispatcher>子元素,来说明当前访问的拦截方式。
<filter-mapping
vfilter-name
>myfilter
vurl-pattern
《dispatcher
《dispatcher
>/b.jsp
>REQUEST
>FORWARE
>myfilter
>/b.jsp
vfilter-mapping
>myfilter >/b.jsp >FORWARDc/
url-pattern
dispatcher
其实最为常用的就是REQUEST和FORWARD两种拦截方式,而INCLUDE和ERROR都比较少用!
其中INCLUDE比较好理解,我们这里不再给出代码,学员可以通过FORWARD方式修改,来自己测
试。
而ERROR方式不易理解,下面给出ERROR拦截方式的例子:
> >myfilter/b.jsp >ERROR > >500
<%
if(true)
thrownewRuntimeException("嘻嘻~");
%>
6过滤器的应用场景
过滤器的应用场景:
执行目标资源之前做预处理工作,例如设置编码,这种试通常都会放行,只是在目标资源
执行之前做一些准备工作;
通过条件判断是否放行,例如校验当前用户是否已经登录,或者用户IP是否已经被禁用;
在目标资源执行后,做一些后续的特殊处理工作,例如把目标资源输出的数据进行处理;
7设置目标资源
在web.xml文件中部署Filter时,可以通过"*”来执行目标资源:
vfilter-mappingvfilter-name > >myfilter/*
>
这一特性与Servlet完全相同!
通过这一特性,我们可以在用户访问敏感资源时,执行过滤器,例如:
这时可以通过过滤器来校验用户身份。
还可以为vfilter-mapping>指定目标资源为某个Servlet,例如:
vservlet>
vservlet-name
>myservletv/servlet-name
>
vservlet-class
>cn.itcast.servlet.MyServlet
v/servlet-class
>
vservlet-mapping
>
vservlet-name
>myservletv/servlet-name
>
vurl-pattern
>/abcv/url-pattern>
v/servlet-mapping
>
vfilter>
vfilter-name
>myfilterv/filter-name>
vfilter-class
>cn.itcast.filter.MyFilter
v/filter-class>
v/filter>
vfilter-mapping
>
vfilter-name
>myfilterv/filter-name>
vservlet-name
>myservletv/servlet-name
>
v/filter-mapping
>
当用户访问http:
//localhost:
8080/filtertest/abc时,会执行名字为myservlet的Servlet,这时会执
行过滤器。
8Filter小结
Filter的三个方法:
voidinit(FilterConfig):
在Tomcat启动时被调用;
voiddestroy():
在Tomcat关闭时被调用;
voiddoFilter(ServletRequest,ServletResponse,FilterChain):
每次有请求时都调用该方法;
FilterConfig类:
与ServletConfig相似,用来获取Filter的初始化参数
ServletContextgetServletContext():
获取ServletContext的方法;
StringgetFilterName():
获取Filter的配置名称;
StringgetInitParameter(Stringname):
获取Filter的初始化配置,与
获取所有初始化参数的名称。
FilterChain类:
voiddoFilter(ServletRequest,ServletResponse):
放行!
表示执行下一个过滤器,或者执行目标资源。
可以在调用FilterChain的doFilter()方法的前后添加语句,在FilterChain的doFilter()方法之前的语句会在目标资源执行之前执行,在FilterChain的doFilter()方法之后的语句会
在目标资源执行之后执行。
四各拦截方式:
REQUESTFORWARDINCLUDEERROR默认是REQUES■方式。
REQUEST拦截直接请求方式;
FORWARD拦截请求转发方式;INCLUDE拦截请求包含方式;ERROR拦截错误转发方式。
过滤器应用案例
分ip统计网站的访问次数
1说明
网站统计每个ip地址访问本网站的次数。
2分析
因为一个网站可能有多个页面,无论哪个页面被访问,都要统计访问次数,所以使用过滤器最为方便。
因为需要分IP统计,所以可以在过滤器中创建一个Map,使用IP为key,访问次数为value。
当有用户访问时,获取请求的IP,如果IP在Map中存在,说明以前访问过,那么在访问次数上加1,
即可;IP在Map中不存在,那么设置次数为1。
把这个Map存放到ServletContext中!
3代码
index.jsp
forEach items="${applicationScope.ipCountMap}" var="entry"> >${entry.key} copyright@ 2008-2022 冰豆网网站版权所有 经营许可证编号:鄂ICP备2022015515号-1