过滤器的工作原理及应用
Servlet过滤器是实现了javax.servlet.Filter接口的服务器端程序,其工作原理是,只要在web.xml文件配置好要拦截的客户端请求,此时可以对请求或者响应统一设置编码,简化操作;同时还可以进行逻辑判断,是否以登陆,有没有权限访问。它是随web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当web应用停止或重新部署的时候才销毁。
当在web.xml中注册了一个filter对某个servlet程序进行拦截处理时,这个filter就成了servlet容器与该servlet程序的通信线路上的第一道关卡,该filter可以对Servlet容器发送给servlet程序的请求和servlet程序回送给servlet容器的响应进行拦截,可以决定是否请求继续传递给servlet程序,以及对请求和响应消息是否进行修改。
在一个web应用程序中可以注册多个filter程序,每个filter程序都可以对一个或一组servlet程序进行拦截
若多个filter程序对某个servlet程序的访问过程进行拦截,当针对该servlet的访问请求到达时,web容器将把这个filter程序组合成一个filter链(过滤器链)filter链中各个filter的拦截顺序与他们在应用程序的web.xml中映射的顺序一致。
在web中过滤器的主要作用
- 对用户请求进行统一认证(限制IP,不允许黑名单用户访问)
- 对用户请求进行记录,审核(写入日志)
- 对用户发送的数据进行过滤和替换(过滤不良消息)
- 转换图像格式
- 对响应内容进行压缩,减少传输量
- 对请求,响应内容进行加密,解密操作
过滤器的类和接口
过滤器本质是一个Servlet类,只是它要实现Filter接口。与过滤器相关的接口有三个,(Filter,FilterConfig,FilterChain)位于Javax.servlet包中。
实现:
过滤器必须实现Filter接口,然后使用这个过滤器类中的FilterChain和FilterConfig接口,该过滤器的引用将传递给FilterChain对象,以允许过滤器把控制权传递给链接中的下一个资源。FilterConfig对象将由容器提供给过滤器,以允许访问该过滤器的初始化数据。
Filter接口
(1)初始化
void init(FilterConfig fileterConfig)Servlet容器创建Servlet过滤器实例后将调用这个方法,在此方法中可以读取webxml文件的内容,包括servlet过滤器的初始化参数,也可以获得应用程序的上下文对象。
void init(FilterConfig fileterConfig){
this.FilterConfig=filterConfig;
}
(2)处理请求和响应
void doDilter(ServletRequest request,ServletResponse response,FilterChain chain) 完成实际的过滤操作,当客户请求访问与过滤器相关的URLhttps://baike.baidu.com/item/url/110640?fr=aladdin时,servlet先调用doFilter方法,FilterChain参数用于访问后续过滤器。
void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
{
//前置代码--在访问资源前执行
chain.doFilter(request,response);
//后置代码--在访问资源后执行
}
(3)销毁
void destroy() servlet容器在销毁过滤器实例前调用该方法,可在此释放servlet过滤器占用的资源
void destroy(){
this.filterConfig=null;
}
FilterChain接口
过滤器链中的下一个过滤器被调用,如果调用该方法的过滤器是最后一个过滤器,那么目标资源将被调用
1(Filter1) 2(Filter2) 3 (servlet方法)
6 5(后置代码) 4
FilterConfig接口
获取ServletContext和Filter配置参数
- String getFilterName() 得到过滤器名字
- ServletContext getServletContext() 得到山下文对象
- String getInitParameter(String name) 得到指定名称的初始化参数
- Enumeration getInitParameterNames() 得到所有初始化参数的名称,类型为集合