1.1Filter的概述
1.1.1 Filter的简介
- Filter也称之为过滤器,Filter是Servlet技术中最激动人心的技术,
- Filter可以管理WEB服务器中所有的WEB资源,
- Filter可以对JSP,Servlet,HTML,以及图片文件等进行拦截和过滤,
- Filter常用于实现一些特殊的功能,比如访问权限的控制,敏感词汇的过滤,乱码的处理等等,
- Filter其实就是一个特殊的Servlet,
- Servlet API提供了Filter接口,在WEB项目中,一个Java类实现了Filter接口,那这个Java类他就是Filter过滤器,
- Filter其实就是在用户访问目标资源之前,对请求和响应进行拦截过滤和处理。
1.1.2 Filter与Listener(下一节)
Filter和Listener是Servlet规范中的两个高级特性,不同于servlet ,他们不用于处理客户端请求,只用于对request,response进行修改,或者对context,session,request事件进行监听,为我们Servlet提供一些额外的辅助性功能,帮助我们简化开发。
1.1.3 Filter过滤器可以完成的事
- 让不让你过(检验用户是否登录)
- 改变你中间的内容(统一全站的字符编码,替换敏感词汇)
- 会有简单案例演示
1.1.4 Filter的作用
- 在httpServletRequest到达Servlet之前,拦截客户的HTTPServletRequest
- 根据要求检查httpServletRequest,也可以修改httpServletRequest头和数据
- 在httpServletResponse到达Servlet之前,拦截客户的HTTPServletResponse
- 根据要求检查httpServletResponse,也可以修改httpServletResponse头和数据
- 图解
在服务器与web资源之间,Filter对请求与响应进行操作
1.2 Filter的入门案例
- 在WEB项目中创建一个Java类,
- 让该类实现javax.servlet.Filter接口,
- 在该类中实现Filter接口的所有方法,
public class FilterDemo implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("FilterDemo执行");
//放行
chain.doFilter(request, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
- 在web.xml文件中进行相关的配置。
<filter>
<display-name>FilterDemo</display-name>
<filter-name>FilterDemo</filter-name>
<filter-class>com.itheima.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-
注意
- filter是一个特殊的Servlet,他的配置和Servlet是一样的
- 他和Servlet本质区别是
- 他不能产生一个请求或者响应,他只能修改某一资源的请求或者响应
- 必须要实现javax.servlet.Filter接口,需要在web.xml中进行配置才能生效
- Filter和特定的url关联,当用户请求访问此url时,才会触发filter调用doFilter这个方法
1.3Filter的生命周期
-
创建
- Filter对象在WEB服务器启动的时候,由WEB服务器帮我们创建
- init()
- Filter对象在WEB服务器启动的时候,由WEB服务器帮我们创建
-
销毁
- Filter对象在WEB服务器关闭的时候会被销毁
- destory()
- Filter对象在WEB服务器关闭的时候会被销毁
Filter的生命周期和Servlet生命周期是一样.他们都提供了init()和destory()方法 .当web服务器启动的时候,就会自动调用init()方法进行初始化,当关闭
web服务器,关机,road整个项目的时候,就会调用destroy()方法来关闭filter-
总结:
- 当web服务器启动的时候,filter就会被加载到内存,并且在调用destory()方法之前都会常驻内存
public class FilterDemo2 implements Filter {
public FilterDemo2() {
// TODO Auto-generated constructor stub
System.out.println("FilterDemo2的构造方法执行了");
}
public void destroy() {
System.out.println("FilterDemo2的destory方法执行了");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("FilterDemo2的doFilter方法执行了");
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
//这方法里面可以 获得 初始化参数
System.out.println("FilterDemo2的init方法执行了");
}
}
1.4 Filter链
在同一个WEB应用中,可以开发编写多个Filter,那这多个Filter组成了一个链子,这个链子我们就称之为Filter链,
WEB服务器在执行Filter链的时候,会根据Filter在web.xml文件中的配置顺序来执行。
- 注意:
- 多个filter对同一个资源进行处理的时候,他实际按照他在web.xml的配置顺序 从上到下 依次执行
- 要访问最后的web资源,需要所有的filter放行,如果其中有一个没有放行,用户是无法访问最后的web资源
- 所以filter的顺序放置需要注意 不然容易爆炸
1.5 获取Filter的初始化参数
- 在web.xml文件中,可以通过<init-param>标签来为Filter配置初始化参数,
- WEB服务器在创建Filter对象的时候,会调用Filter对象的init方法,并且将封装了Filter初始化参数的FilterConfig对象传递进去,
- 在Filter的init方法中,就可以通过FilterConfig对象来获取Filter的初始化参数。
配置文件
<filter>
<display-name>FilterDemo3</display-name>
<filter-name>FilterDemo3</filter-name>
<filter-class>com.itheima.filter.FilterDemo3</filter-class>
<init-param>
<param-name>username</param-name>
<param-value>zhangsan</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FilterDemo3</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
编写初始化方法
public class FilterDemo3 implements Filter {
private FilterConfig fConfig;
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//fConfig.getInitParameter(name)
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
this.fConfig = fConfig;
//获取初始化参数
/*String username = fConfig.getInitParameter("username");
String password = fConfig.getInitParameter("password");
System.out.println(username);
System.out.println(password);*/
//获取所有的初始化参数的name
Enumeration<String> e = fConfig.getInitParameterNames();
while(e.hasMoreElements()) {
String name = e.nextElement();
//System.out.println(name);
String value = fConfig.getInitParameter(name);
System.out.println(name + "=" + value);
}
}
}