文章目录

  • 01-Filter概述(掌握)
  • 02-Filter入门案例(掌握)
  • 03-Filter执行流程(掌握)
  • 04-Filter生命周期(掌握)
  • 05-Filter相关配置(掌握)
  • 06-过滤器链(掌握)
  • 07-Filter拦截行为(掌握)
  • 08-Filter注解开发(掌握)
  • 09-监听器概述(掌握)
  • 10-一类监听器概述(掌握)
  • 11-一类监听器之ServletRequestListener(掌握)
  • 12-一类监听器之ServletContextListener(重点)
  • 13-二类监听器概述(掌握)
  • 14-二类监听器之ServletRequestAttributeListener(了解)
  • 15-三类监听器概述(了解)
  • 16-三类监听器之HttpSessionBindingListener(掌握)
  • 17-session钝化和活化(掌握)
  • 18-三类监听器之HttpSessionActivationListener(掌握)
  • 19-监听器的注解开发(掌握)


01-Filter概述(掌握)

  • 概述
A filter is an object that performs filtering tasks on either the request to a resource (a servlet or static content), or on the response from a resource, or both. 

Filters perform filtering in the doFilter method. Every Filter has access to a FilterConfig object from which it can obtain its initialization parameters, and a reference to the ServletContext which it can use, for example, to load resources needed for filtering tasks. 

Examples that have been identified for this design are: 
    Authentication Filters 
    Logging and Auditing Filters 
    Image conversion Filters 
    Data compression Filters 
    Encryption Filters 
    Tokenizing Filters 
    Filters that trigger resource access events 
    XSL/T filters 
    Mime-type chain Filter
  • Filter对象可以用于过滤request和response;
  • Filter对象有一个FilterConfig对象,通过这个对象可以获取初始化参数,以及使用ServletContext对象;
  • 适用场景:Authentication Filters 、 Tokenizing Filters …

02-Filter入门案例(掌握)

  • 开发步骤
  • ①定义FIlter类实现Filter接口
  • 重写方法
  • ②编写web.xml
  • 声明Filter类
  • ①定义FIlter类实现Filter接口
@WebServlet("/demo01")
public class Demo01Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Demo01Servlet");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
  • ②编写web.xml
<filter>
    <filter-name>Demo01Filter</filter-name>
    <filter-class>com.atguigu.filter.Demo01Filter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Demo01Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

03-Filter执行流程(掌握)

  • 执行流程
  • 注意事项
  • chain.doFilter只能执行一次。

04-Filter生命周期(掌握)

  • 生命周期
  • 实例化
  • 服务器启动
  • 初始化
  • 服务器启动
  • 销毁
  • 服务器关闭

05-Filter相关配置(掌握)

  • 相关配置
  • ①初始化参数
  • ②过滤路径
  • 2.1,完全匹配:以"/"开头
  • 2.2,目录匹配:以"/“开头,以”*"结尾
  • 2.3,后缀名匹配: 以"*"开头,以"后缀名"结尾
  • 2.4,过滤指定Servlet
  • ①初始化参数
<filter>
    <filter-name>Demo03Filter</filter-name>
    <filter-class>com.atguigu.filter.Demo03Filter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>Demo03Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
public class Demo03Filter implements Filter {

    private String encoding;


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        encoding = filterConfig.getInitParameter("encoding");
        System.out.println("encoding = " + encoding);

        Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();
        while (initParameterNames.hasMoreElements()) {
            String initParameterName = initParameterNames.nextElement();
            String initParameterValue = filterConfig.getInitParameter(initParameterName);
            System.out.println("initParameterName = " + initParameterName + " , initParameterValue = " + initParameterValue);

        }

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        System.out.println("encoding = " + encoding);
        chain.doFilter(request, response);//相当于执行Demo01Servlet

    }
}
  • ②过滤路径
<filter>
    <filter-name>Demo04Filter</filter-name>
    <filter-class>com.atguigu.filter.Demo04Filter</filter-class>
</filter>

<!--2.1,完全匹配:以"/"开头-->
<!--
<filter-mapping>
    <filter-name>Demo04Filter</filter-name>
    <url-pattern>/demo01</url-pattern>
</filter-mapping>
-->
<!--2.2,目录匹配:以"/"开头,以"*"结尾-->
<!--
<filter-mapping>
    <filter-name>Demo04Filter</filter-name>
    <url-pattern>/a/b/c/*</url-pattern>
</filter-mapping>
-->
<!--2.3,后缀名匹配: 以"*"开头,以"后缀名"结尾-->
<!--
<filter-mapping>
    <filter-name>Demo04Filter</filter-name>
    <url-pattern>*.html</url-pattern>
</filter-mapping>
-->
<!--2.4,过滤指定Servlet-->
<filter-mapping>
    <filter-name>Demo04Filter</filter-name>
    <servlet-name>Demo01Servlet</servlet-name>
    <servlet-name>Demo02Servlet</servlet-name>
</filter-mapping>

06-过滤器链(掌握)

  • 概述
  • 由多个过滤器组成一个过滤链。
  • 只有当所有过滤器都放行,请求才能到达目标资源,如果有某一 个过滤器没有放行,那么请求则无法到达后续过滤器以及目标资源
  • 执行顺序
  • 先配置,先过滤,后放行.
  • 原因分析
  • 代码实现
public class Demo05Filter implements Filter {



    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Demo05Filter 过滤");
        chain.doFilter(request, response);//相当于执行Demo01Servlet
        System.out.println("Demo05Filter 放行");

    }
}
public class Demo06Filter implements Filter {



    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Demo06Filter 过滤");
        chain.doFilter(request, response);//相当于执行Demo01Servlet
        System.out.println("Demo06Filter 放行");

    }
}
<filter>
    <filter-name>Demo05Filter</filter-name>
    <filter-class>com.atguigu.filter.Demo05Filter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Demo05Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
    <filter-name>Demo06Filter</filter-name>
    <filter-class>com.atguigu.filter.Demo06Filter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Demo06Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

07-Filter拦截行为(掌握)

  • 概述
  • Filter过滤器默认拦截的是请求,但是在实际开发中,我们还有请求转发和请求包含,以及由服务器触 发调用的全局错误页面。默认情况下过滤器是不参与过滤的,要想使用,就需要我们配置。
  • 拦截行为
  • ①REQUEST : 默认值,过滤请求
  • ②ERROR : 过滤跳转全局错误页面
  • ③FORWARD :过滤请求转发
  • ④INCLUDE : 过滤请求包含
  • ①REQUEST : 默认值,过滤请求
<!--①REQUEST : 默认值,过滤请求-->
<filter-mapping>
    <filter-name>Demo07Filter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>
  • ②ERROR : 过滤跳转全局错误页面
<!--②ERROR : 过滤跳转全局错误页面-->
<filter-mapping>
    <filter-name>Demo07Filter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>
  • ③FORWARD :过滤请求转发
<!--③FORWARD :过滤请求转发-->
<filter-mapping>
    <filter-name>Demo07Filter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>
  • ④INCLUDE : 过滤请求包含
<!--④INCLUDE : 过滤请求包含-->
<filter-mapping>
    <filter-name>Demo07Filter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
</filter-mapping>

08-Filter注解开发(掌握)

  • 概述
  • 使用@WebFilter注解替代XML配置。
  • 源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebFilter {

    WebInitParam[] initParams() default {};

    String filterName() default "";

    String[] servletNames() default {};

    String[] value() default {};

    String[] urlPatterns() default {};

    DispatcherType[] dispatcherTypes() default {DispatcherType.REQUEST};

}
  • 代码实现1
@WebFilter(
        filterName = "Demo08Filter",
        urlPatterns = {
                "/demo01", "/demo02"
        },
        initParams = {
                @WebInitParam(
                        name = "encoding", value = "utf-8"
                ),
                @WebInitParam(
                        name = "encoding2", value = "gbk"
                )
        },
        dispatcherTypes = {
                DispatcherType.REQUEST,
                DispatcherType.FORWARD,
                DispatcherType.INCLUDE,
                DispatcherType.ERROR
        },
        servletNames = {
                "Demo01Servlet", "Demo02Servlet"
        }

)
public class Demo08Filter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Demo08Filter 过滤");
        chain.doFilter(request, response);//相当于执行Demo01Servlet
        System.out.println("Demo08Filter 放行");

    }
}
  • 代码实现2
@WebFilter("/*")
public class Demo09Filter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Demo09Filter 过滤");
        chain.doFilter(request, response);//相当于执行Demo01Servlet
        System.out.println("Demo09Filter 放行");

    }
}

09-监听器概述(掌握)

  • 回顾
  • 事件源 : 事件发生的源头
  • 监听器 : 监听事件发生的组件
  • 事件绑定 : 将事件源和监听器关联起来
  • 事件 : 一件事
  • Servlet事件
  • 事件源 : 三大域对象
  • 监听器 : 三类监听器
  • 事件绑定 : xml配置、注解配置
  • 事件 : 三大域对象内容发生改变
  • 分类
  • 一类监听器
  • 监听三大域对象的状态改变(初始化、销毁)
  • 二类监听器
  • 监听三大域对象中的内容改变(添加、修改、移除)
  • 三类监听器
  • 监听三大域对象中的对象状态改变(绑定/解绑、钝化/活化)

10-一类监听器概述(掌握)

  • 概述
  • 监听三大域对象的状态改变(初始化、销毁)
  • 一类监听器
  • ServletRequestListener
  • 监听ServletRequest域对象的状态改变(初始化、销毁)
  • HttpSessionListener
  • 监听HttpSession域对象的状态改变(初始化、销毁)
  • ServletContextListener
  • 监听ServletContext域对象的状态改变(初始化、销毁)

11-一类监听器之ServletRequestListener(掌握)

  • 概述
  • 监听ServletRequest域对象的状态改变(初始化、销毁)
  • 代码实现
public class MyServletRequestListener implements ServletRequestListener {

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("requestInitialized");
    }

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("requestDestroyed");
    }


}
<listener>
    <listener-class>com.atguigu.listener1.MyServletRequestListener</listener-class>
</listener>

12-一类监听器之ServletContextListener(重点)

  • 概述
  • 监听ServletContext域对象的状态改变(初始化、销毁)
  • 代码实现
public class MyServletContextListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("contextInitialized");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("contextDestroyed");

    }
}
<listener>
    <listener-class>com.atguigu.listener1.MyServletContextListener</listener-class>
</listener>

13-二类监听器概述(掌握)

  • 概述
  • 监听三大域对象中的内容改变(添加、修改、移除)
  • 分类
  • ServletRequestAttributeListener
  • 监听ServletRequest域对象中的内容改变(添加、修改、移除)
  • HttpSessionAttributeListener
  • 监听HttpSession域对象中的内容改变(添加、修改、移除)
  • ServletContextAttributeListener
  • 监听ServletContext域对象中的内容改变(添加、修改、移除)

14-二类监听器之ServletRequestAttributeListener(了解)

  • 概述
  • 监听ServletRequest域对象中的内容改变(添加、修改、移除)
  • 代码实现
public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {

    @Override
    public void attributeAdded(ServletRequestAttributeEvent srae) {
        System.out.println("attributeAdded");
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent srae) {
        System.out.println("attributeRemoved");

    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent srae) {
        System.out.println("attributeReplaced");

    }
}
<listener>
    <listener-class>com.atguigu.listener2.MyServletRequestAttributeListener</listener-class>
</listener>

15-三类监听器概述(了解)

  • 概述
  • 监听三大域对象中的对象状态改变(绑定/解绑、钝化/活化)
  • 分类
  • HttpSessionBindingListener
  • 监听HttpSession域对象中的对象状态改变(绑定/解绑)
  • HttpSessionActivationListener
  • 监听HttpSession域对象中的对象状态改变(钝化/活化)

16-三类监听器之HttpSessionBindingListener(掌握)

  • 概述
  • 监听HttpSession域对象中的对象状态改变(绑定/解绑)
  • 代码实现
public class Student  implements HttpSessionBindingListener {

    private Integer studentId;
    private String studentName;

    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        System.out.println("Student绑定");
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        System.out.println("Student解绑");
    }

}

17-session钝化和活化(掌握)

  • 概述
  • 当服务器突然宕机时,有一些需要长期使用的session数据会销毁,重启服务器后无法使用这些数据;
  • 因此,我们需要将这些session数据保留,并且下次重启之后可以使用。此时就可以考虑session的钝 化与活化
  • 钝化
  • 序列化 : 当服务器关闭时,将session中的对象信息以字节的形式存储到缓存文件
  • 活化
  • 反序列化 : 当服务器启动时,将缓存文件中的字节数据以对象的形式还原到session中
  • 开发步骤
  • ①JavaBean实体类实现Serializable接口
  • ②编写tomcat的context.xml文件
  • ①JavaBean实体类实现Serializable接口
public class Teacher implements Serializable {

    private String teacherName;

}
  • ②编写tomcat的context.xml文件
<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="true" maxIdleSwap="1">
    <Store className="org.apache.catalina.session.FileStore" directory="E:\Program Files\apache-tomcat-9.0.56\conf\Session"/>
</Manager>

18-三类监听器之HttpSessionActivationListener(掌握)

  • 概述
  • 监听HttpSession域对象中的对象状态改变(钝化/活化)
  • 代码实现
public class Teacher implements Serializable , HttpSessionActivationListener {

    private String teacherName;

    @Override
    public void sessionWillPassivate(HttpSessionEvent se) {
        System.out.println("Teacher钝化");
    }

    @Override
    public void sessionDidActivate(HttpSessionEvent se) {
        System.out.println("Teacher活化");

    }
}

19-监听器的注解开发(掌握)

  • 概述
  • 使用@WebListener注解替代XML配置.
  • 代码实现
@WebListener
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {

    @Override
    public void attributeAdded(HttpSessionBindingEvent se) {
        System.out.println("attributeAdded");
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent se) {
        System.out.println("attributeRemoved");

    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent se) {
        System.out.println("attributeReplaced");

    }
}