过滤器 监听器

Filter过滤器

        是servlet规范中的一个接口,在javax.servlet包下,名称为Filter

web中的过滤器:
    当用户访问服务器资源时,过滤器将请求拦截下来,完成一些通用的功能

应用场景:
    统一编码处理、登录验证

过滤器 监听器_第1张图片

编写一个普通类,实现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.注解配置)(可以配置初始化参数)

    
    
        FilterDemo
        com.itheima.web.filter.FilterDemo1
    
    
        FilterDemo
        
        /*
    

生命周期

出生:服务器启动,应用加载时,对象创建

活着:只要应用对外提供服务,过滤器一直可用,每次都是执行doFilter方法

死亡:服务器停止,应用卸载或者服务器宕机,此时对象消亡


多个过滤器

        如果有下一个拦截器执行下一个拦截器,如果当前拦截器处于拦截器链的最后一个,则执行资源

        过滤器的执行顺序:先进后出

                xml配置:按映射的顺序

                注解:看类名ACSII码小在前


过滤器拦截行为

配置了之后,默认就会改变(性质和构造器一样)

REQUEST     请求,是默认值
FORWARD     转发
INCLUDE     包含
ERROR       全局错误页
ASYNC       异步

Listenner监听器

        基于观察者设计模式

过滤器 监听器_第2张图片

  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转成集合
        List pathList = 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);
    }
}

你可能感兴趣的:(JavaWeb,servlet,java,前端)