是servlet规范中的一个接口,在javax.servlet包下,名称为Filter
web中的过滤器:
当用户访问服务器资源时,过滤器将请求拦截下来,完成一些通用的功能
应用场景:
统一编码处理、登录验证编写一个普通类,实现javax.servlet.Filter接口,重新接口方法
public class FilterDemo implements Filter { public FilterDemo(){ System.out.println("对象创建了"); } @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("执行了init方法"); } /** * * @param request 请求对象 * @param response 响应对象 * @param chain 过滤器链对象,他里面只有一个方法。就是放行方法。 * @throws IOException * @throws ServletException */ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("访问资源之前:FilterDemo执行了doFilter"); //放行 chain.doFilter(request,response); System.out.println("访问资源之后:FilterDemo执行了doFilter"); } @Override public void destroy() { System.out.println("执行了destroy方法"); } }配置过滤器(1.xml配置,2.注解配置)(可以配置初始化参数)
<filter> <filter-name>FilterDemofilter-name> <filter-class>com.itheima.web.filter.FilterDemo1filter-class> filter> <filter-mapping> <filter-name>FilterDemofilter-name> <url-pattern>/*url-pattern> filter-mapping>生命周期
出生:服务器启动,应用加载时,对象创建
活着:只要应用对外提供服务,过滤器一直可用,每次都是执行doFilter方法
死亡:服务器停止,应用卸载或者服务器宕机,此时对象消亡
多个过滤器
如果有下一个拦截器执行下一个拦截器,如果当前拦截器处于拦截器链的最后一个,则执行资源
过滤器的执行顺序:先进后出
xml配置:按映射的顺序
注解:看类名ACSII码小在前
过滤器拦截行为
配置了之后,默认就会改变(性质和构造器一样)
<dispatcher>REQUESTdispatcher> 请求,是默认值 <dispatcher>FORWARDdispatcher> 转发 <dispatcher>INCLUDEdispatcher> 包含 <dispatcher>ERRORdispatcher> 全局错误页 <dispatcher>ASYNCdispatcher> 异步
基于观察者设计模式
web中的监听器在开发中使用的比较少,主要用于监听web三大域对象:Request、Session、ServletContext. 主要监听这三个域对象的创建和销毁以及域对象中存储对象的增加和减少. web中的监听器一共有8个(扩展): ServletContextListener 监听ServletContext对象的创建和销毁 需要配置 HttpSessionListener 监听HttpSession对象的创建和销毁 需要配置 ServletRequestListener 监听ServletRequest对象的创建和销毁 需要配置 ServletContextAttributeListener 监听ServletContext对象的数据的变化 需要配置 HttpSessionAttributeListener 监听HttpSession对象的数据的变化 需要配置 ServletRequestAttributeListener 监听ServletRequest对象的数据的变化 需要配置 HttpSessionBindingListener 监听自己被绑定、解绑到HttpSession中 无需配置 HttpSessionActivationListener 监听自己被钝化或激活了 无需配置
package com.itheima.web.listener; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; import java.io.FileInputStream; import java.io.InputStream; import java.util.Arrays; import java.util.List; import java.util.Properties; import java.util.ResourceBundle; /** * 用于读取配置文件,初始化不需要检查登录uri的监听器 * 编码步骤: * 第一步:编写一个普通类,实现接口,并重写接口方法 * 第二步:配置 * 支持xml的配置和注解的配置 */ @WebListener public class PermissionPathListener implements ServletContextListener { /** * 监听到对象创建执行的方法 * 执行时机: * 对象创建完之后执行 * @param sce 事件对象。(他里面封装着事件源:ServletContext) */ @Override public void contextInitialized(ServletContextEvent sce) { //1.创建读取properties文件的对象 ResourceBundle bundle = ResourceBundle.getBundle("permissionConfig"); //2.根据key获取value String value = bundle.getString("pathList"); //3.把value转成集合 ListpathList = Arrays.asList(value.split(",")); //4.获取事件源对象 ServletContext servletContext = sce.getServletContext(); //System.out.println("监听器的监听创建方法:"+servletContext); //5.把读取到的pathList存入应用共享区域 servletContext.setAttribute("pathList",pathList); System.out.println(pathList); } /** * 监听到对象销毁执行的方法 * 执行时机: * 对象销毁之前,即将销毁时执行。 * @param sce 事件对象。(他里面封装着事件源:ServletContext) */ @Override public void contextDestroyed(ServletContextEvent sce) { //1.获取事件源对象 ServletContext servletContext = sce.getServletContext(); System.out.println("监听器的监听销毁方法:"+servletContext); } }