生活举例: 公司前台,停车场安保,地铁验票闸机
java中过滤仅仅是对请求做出过滤

客户端向服务器发出请求,在服务器内部,相应资源之前,如上如所示;就会经过一层过滤器,过滤器做出判断,如果不能通过会将其返回,如果通过那么就正常访问服务器资源;
过滤器开发中应用的场景
1.1实现过滤器
配置过滤器的映射

* @param servletRequest
* @param servletResponse
* @param filterChain 这是一个过滤器链,在执行到此方法前,可以进行多个过滤器,通过过滤器链可以对当前情况做出判断是否响应
filterChain.doFilter(servletRequest,servletResponse);
/**
* 日志过滤器,记录请求的历史
*/
public class loggingFilter implements Filter {
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
*
* @param servletRequest
* @param servletResponse
* @param filterChain 这是一个过滤器链,在执行到此方法前,可以进行多个过滤器,通过过滤器链可以对当前情况做出判断是否响应
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 2.写出响应前代码,需求写响应日志
System.out.println("响应前");
// 参数父转子
/**
* 参数父转子
* Httpservlet对象是Servlet对象的子对象,功能强大 我们需要获取响应的uri因此需要转用子对象进行获取
*/
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse res = (HttpServletResponse)servletResponse;
String requestURI = req.getRequestURI();
String data = dateFormat.format(new Date());
String logging = requestURI+data+ "被访问了";
System.out.println(logging);
// 4.求1前后的时间差
long l1 = System.currentTimeMillis();
// 1.如果此过滤器进行放行,可以直接调用filterChain的doFilter方法
filterChain.doFilter(servletRequest,servletResponse);
long l2 = System.currentTimeMillis();
// 3.写出响应之后的日志
System.out.println("响应之后");
String afterlogging = requestURI+data+ "响应了"+(l2-l1) +"毫秒";
System.out.println(afterlogging);
}
}
整体代码入上所示;结果如下所示;

filter1
com.atguigu.filters.loggingFilter
filter1
/*
Servlet1
关于路径的配置过滤器可以url-pattern或者直接写url-name都可
下面写法是通过url-pattern配置 批Servlet匹配;


@WebFilter("/*")

1.构造 constorct 默认重写
2.初始化 init
3.过滤 doFilter (多次)
4.销毁 destory
整体流程和Servlet生命周期一致

观察上述图,不同过滤器约束不同的资源,请求发出的时候,请求经过过滤器链的 被约束过滤器,请求走的时候 以相反的方向经过过滤器的约束路径;具体Filter优先级,是看xml文件的filter-mapping标签配置顺序;
仔细思考也能想清楚,filter-mapping关联request的url-pattern

如果是过滤器注解方式,其优先级是看filter的包下优先级
也就是其字典顺序
