文章目录
- 过滤器
- 1.过滤器的实现
- 1.1 实现过滤器
- 1.2 配置过滤器
- 1.2.1 过滤器的xml方式
- 1.2.2 过滤器的注解方式
- 2. 过滤器的生命周期
- 3. 过滤器链使用
过滤器
-
生活举例: 公司前台,停车场安保,地铁验票闸机
-
java中过滤仅仅是对请求做出过滤
客户端向服务器发出请求,在服务器内部,相应资源之前,如上如所示;就会经过一层过滤器,过滤器做出判断,如果不能通过会将其返回,如果通过那么就正常访问服务器资源;
过滤器开发中应用的场景
- 日志的记录
- 性能的分析
- 乱码的处理
- 事务的控制
- 登录的控制
- 跨域的处理
- … …
1.过滤器的实现
-
1.1实现过滤器
- 实现Filter接口
- 重写过滤方法
- 如下图所示,重写的是doFilter方法
- doFilter请求的时候对请求做出控制,相应的时候,可以对相应的内容进行控制;
-
配置过滤器的映射
- web.xml
- 注解方式
1.1 实现过滤器
- doFilter相关参数
* @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 这是一个过滤器链,在执行到此方法前,可以进行多个过滤器,通过过滤器链可以对当前情况做出判断是否响应*/@Overridepublic 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);}
}
- 细节点
- 响应前后时间使用System.currentTimeMillis()做差返回值为long
- 时间日期格式化SimpleDateFormat().format(new Date)
- doFilter中形参是ServletResponse,没有URI获取的功能,我们的一般做法是向下强转,转为功能更为强大的HttpServletResponse方法
整体代码入上所示;结果如下所示;
1.2 配置过滤器
1.2.1 过滤器的xml方式
- 同Servlet配置
<!-- 过滤器写法 同Servlet配置--><filter><filter-name>filter1</filter-name><filter-class>com.atguigu.filters.loggingFilter</filter-class></filter><filter-mapping><filter-name>filter1</filter-name>
<!--url-pattern 根据请求路径 指定过滤/* 匹配所有/a/* 匹配a开头所有*.html 匹配所有html后缀/Servlet1 精确匹配servlet-name 指定特定Servlet进行过滤规则一个filter-mapping可以多个url-pattern和servlet-name
--><url-pattern> /*</url-pattern><servlet-name>Servlet1</servlet-name></filter-mapping>
-
关于路径的配置过滤器可以url-pattern或者直接写url-name都可
-
下面写法是通过url-pattern配置 批Servlet匹配;
- 如果配置Servlet-name那么此过滤照片不可用,且需要手动配置servlet-name
1.2.2 过滤器的注解方式
@WebFilter("/*")
2. 过滤器的生命周期
-
1.构造 constorct 默认重写
-
2.初始化 init
-
3.过滤 doFilter (多次)
-
4.销毁 destory
整体流程和Servlet生命周期一致
3. 过滤器链使用
- 过滤器链的形成是tomcat自动给我们形成的
观察上述图,不同过滤器约束不同的资源,请求发出的时候,请求经过过滤器链的 被约束过滤器,请求走的时候 以相反的方向经过过滤器的约束路径;具体Filter优先级,是看xml文件的filter-mapping标签配置顺序;
仔细思考也能想清楚,filter-mapping关联request的url-pattern
如果是过滤器注解方式,其优先级是看filter的包下优先级也就是其字典顺序