1.过滤器介绍
- 在程序中访问服务器资源时,当一个请求到来,服务器首先判断是否有过滤器与请求资源相关联,如果有,过滤器可以将请求拦截下来,完成一些特定的功能,再由过滤器决定是否交给请求资源。如果没有则像之前那样直接请求资源了。响应也是类似的!
- 过滤器一般用于完成通用的操作,例如:登录验证、统一编码处理、敏感字符过滤等等
2.Filter过滤器介绍
- Filter 是一个接口。如果想实现过滤器的功能,必须实现该接口!
- FilterChain 是一个接口,代表过滤器链对象。由 Servlet 容器提供实现类对象。直接使用即可。过滤器可以定义多个,就会组成过滤器链。如果有多个过滤器,在第一个过滤器中调用下一个过滤器,依次类推。直到到达最终访问资源。如果只有一个过滤器,放行时,就会直接到达最终访问资源。
3.Filter过滤器的使用
以拦截后统一处理请求、响应乱码问题作使用
【注:放行之后的代码【servlet走完才会回来走放行之后的代码】】
//过滤器基本使用[防止响应乱码]
//@WebFilter("/*")//拦截路径所有
//@WebFilter({"/ServletDemo1","/ServletDemo2"})
//@WebFilter(urlPatterns={"/ServletDemo1","/ServletDemo2"})
//@WebFilter(servletNames = {"ServletDemo1","ServletDemo2"})//请求servlet都拦截 请求转发的不会拦截 但是经过过滤器不会乱码
@WebFilter(servletNames = {"ServletDemo1"},dispatcherTypes = {DispatcherType.FORWARD,DispatcherType.REQUEST})//请求转发的请求拦截
public class FilterDemo1 implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("FilterDemo1执行了");
//处理乱码【一定要在放行之前执行】
servletResponse.setContentType("text/html;charset=utf-8");
//放行
filterChain.doFilter(servletRequest,servletResponse);
//放行之后的代码【servlet走完才会回来走放行之后的代码】
//System.out.println("放行之后的代码执行了");
}
}
4.过滤器注解拦截配置
- 拦截具体资源: /index.jsp
只有访问index.jsp资源时,过滤器才会被执行 - 目录拦截【常用】:
/user/* :访问/user下的所有资源时,过滤器都会被执行
/* :访问所有资源时,过滤器都会被执行 - 后缀名拦截: *.jsp
访问所有后缀名为jsp资源时,过滤器都会被执行
5.过滤器xml配置方式
- 多个过滤器谁的映射在上面就先执行谁和无关
- xml和注解同时写则都运行2+2=4
- 注解的方式在xml后执行
<filter>
<filter-name>FilterDemo2</filter-name>
<filter-class>com.itheima.filter.FilterDemo2</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>FilterDemo1</filter-name>
<filter-class>com.itheima.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
6.Filter过滤器的生命周期及FilterConfig初始化配置
FilterConfig初始化配置
<filter>
<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>
</filter>
<filter-mapping>
<filter-name>FilterDemo3</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
FilterDemo3过滤器生命周期
//过滤器生命周期
//FilterConfig
public class FilterDemo3 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("服务启动时创建过滤器对象");
//获取过滤器名称
System.out.println(filterConfig.getFilterName());
//根据key获取值
System.out.println(filterConfig.getInitParameter("username"));
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("对象提供服务的过程,执行 doFilter()方法");
}
@Override
public void destroy() {
System.out.println("服务器关闭或者应用卸载时过滤器对象销毁");
}
}
打印结果:
---------------------------------------------------------
服务启动时创建过滤器对象
FilterDemo3
zhangsan
FilterDemo1执行了//此处是上面写的过滤器
对象提供服务的过程,执行 doFilter()方法
服务器关闭或者应用卸载时过滤器对象销毁