Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
1.1.2.过滤器的功能
(1)过滤器可以拦截对资源的访问
(2)一个过滤器可以拦截多个资源,一个资源也可能被多个过滤器拦截
(3)所谓的拦截是根据访问的URL地址来确定访问的是哪个资源,确定是否拦截
(4)所谓的拦截其实就是拦截下来代表请求的request和响应的response
(5)拦截后:控制是否允许访问、访问之前和之外做一些额外操作
1.2.过滤器开发入门
1.2.1.开发过滤器的两个步骤
想要开发一个过滤器,需要如下两个步骤。
(1)写一个类实现Filter接口
(2)在web.xml中配置过滤器
1.2.2.写一个类实现javax.servlet.Filter接口
init为初始化方法,在Filter对象被创建出来时,Servlet容器会调用该方法对filter进行初始化。
destory为销毁的方法,在过滤器对象被销毁之前,服务器会调用这个方法执行善后工作。
doFilter为过滤器中最核心的方法,当过滤器拦截到对资源的访问时,服务器会自动调用该方法执行过滤代码。 我们只需要在这个方法中设计过滤器的逻辑代码即可。
其中FilterConfig代表当前过滤器在web.xml中的配置。
FilterChain代表过滤器链。
一个资源可能被多个过滤器所拦截,拦截的顺序是按照这些过滤器的在web.xml中的配置顺序所决定
所有拦截当前资源的过滤器按照拦截顺序就组成了一个拦截器链,filterchain,代表的就是当前拦截器链.filterchain对象提供了一个dofilter的方法,一旦执行这个方法,表明当前过滤器放行,执行过滤器链的下一个节点,如果下一个节点没有过滤器了,就执行真正要访问的资源。
1.2.3.在web.xml中配置一下过滤器
— 配置过滤器
FirstFilter
—为过滤器起一个名字
com.itheima.filter.FirstFilter
—过滤器类的全路径名
— 可选的 可以配置多个 过滤器的初始化参数 可以在过滤器中通过FilterConfig对象来获取
name1
value1
— 配置过滤器的拦截路径 ,一个可以配置多个
FirstFilter
—为哪个过滤器进行配置
/*
— 拦截哪个路径 其中url-pattern的写法和学习Serlvet时的url-pattern的写法相同 这个url-pattern可以配置多个
Demo1Servlet
—拦截哪个名字的Servlet 可以配置多个
REQUEST
— 配置拦截哪种类型的对资源的访问,可选的值有REQUEST FORWARD INCLUDE ERROR,如果不配置默认只拦截REQUEST方式,如果具体配置了就拦截具体配置的方式的对资源的访问,此标签可以配置多个
1.3.Filter的生命周期
1.3.1.Filter的生命周期
当服务器启动,web应用加载后,立即创建出这个web应用中的所有过滤器对象,创建出来后立即调用过滤器的init方法执行初始化操作.从此这些过滤器对象驻留在内存中为后续的拦截进行服务.每当拦截到资源时,都会导致dofilter方法执行.最终直到服务器关闭或web应用移除出容器时,随着web应用的销毁,过滤器对象销毁,销毁之前调用destory方法执行善后工作。
init 和destory 生命周期的回调方法
1.4.FilterConfig接口
1.4.1.Filterconfig接口
用户在配置filter时,可以使用为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始化参数的filterConfig对象传递进来。
1.4.2.Filterconfig接口提供的方法
FilterConfig提供的方法:
String getFilterName():得到filter的名称。
String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
public ServletContext getServletContext():返回Servlet上下文对象的引用。
1.5.EasyMall全站乱码解决过滤器
1.5.1.全站乱码过滤器
我们可以开发一个Filter,拦截所有的动态web资源,在动态web资源执行之前,解决好乱码,从而一劳永逸的解决全站乱码问题。
对于响应数据乱码,只需要设置Content-Type即可解决乱码。
对于请求参数乱码,如果是POST提交,可以一行代码解决,如果是GET提交需要手动的编解码解决乱码。
1.5.2.代码实现
如图-3所示:
图-3
全站乱码过滤器
EncodingFilter
com.itheima.filter.EncodingFilter
EncodingFilter
/*