Filter 的应用场景、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>

< sevlet-mapping>

> myfilter< /filter-name>

< filter-class>cn.itcaat. filter.MyFilterilter-class>

Filter 的应用场景,Filter 的目标资源,小结< filter-mapping>

 myfilter'

<servlet-name > myservlet servlet-name)

mapping>

批注: <servlet-name > myservlet servlet-name)

这里没有指定< url-patter>,而是指定< server-name>!注意,它与某个 servlet 的配置名称相同!

当用户访问http: localhost:8080/filtertest/abc时,会执行名字为 myservlet 的servlet ,这时会执行过滤器。

注:serlet-name 指定方式可以有多个。

 

四、Filter-mapping 的子元素。

<fliter-name>;

<url-pattern>;

<dispatcher>;

<servlet-name>。

五、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:拦截错误转发方式。

阅读剩余
THE END