filter过滤器&listener监听器

filter过滤器

概述

1)什么是filter servlet listener?

服务器端有三个组件:servlet filter listener
servlet: 本质上就是一个实现接口规范(servlet)的类,可以对浏览器的请求和响应做处理
filter:本质上就是一个实现接口规范(filter)的类,可以对浏览器访问服务器请求时的一种过滤
lstener:本质上就是一个实现接口规范(很多)的类,监听域对象的状态变化(创建和销毁)

2)filter的作用?

filter的核心作用:对浏览器的请求做拦截过滤(不放行 放行)

3)filter如何使用?

1 xml的配置方式
		适用于第三方提供的过滤器或者是自己编写的过滤器
2 注解的配置方式
		适用自己编写的过滤器 

xml配置文件方式:

创建一个java类,实现filter的接口
在web.xml中配置filter要拦截的资源

注解方式:

在自定义的filter类上添加注解:
@WebFilter(filterName = "MyFilter1",urlPatterns = "/sd1")

注解方式:

package cn.itcast.filter;

import javax.servlet.*;
import java.io.IOException;

//注解配置
@WebFilter(urlPatterns = "/sd1")
public class MyFilter1 implements Filter {

    // filter创建会执行的方法
    public void init(FilterConfig config) throws ServletException {

    }

    // filter的核心过滤方法
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {

        System.out.println("我是拦截器,我拦截住了浏览器的请求...");

        // 默认没有放行
        //手动放行
        chain.doFilter(req,resp);
    }

    //filter销毁会执行的方法
    public void destroy() {
    }


}

xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
           version="2.5">


    <filter>
        <filter-name>MyFilter1</filter-name>
        <filter-class>cn.itcast.filter.MyFilter1</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>MyFilter1</filter-name>
        <!--filter要拦截的路径-->
        <url-pattern>/sd1</url-pattern>
    </filter-mapping>

</web-app>

filter知识点

1) 多个filter的执行顺序

特点:多个filter对同一个资源匹配,如果访问该资源多个filter都会执行
	配置文件方式:如果多个filter对同一个资源进行了拦截 执行的顺序是配置文件的从上到下顺序
	注解方式:如果多个filter对同一个资源进行了拦截 执行的顺序是按照filter文件名的自然排序循序

2) filter的执行流程

filter过滤器&listener监听器

3) filter的生命周期(了解)

从filter的出生到filter的死亡 有3个方法伴随:init() destory() dofilter()
服务器启动创建filter对象执行init方法
浏览器访问到了匹配到的资源 执行dofilter方法 访问一次执行一次
当服务器关闭的时候 销毁当前filter 执行destory方法 
总结:filter的关注点:开发只关注doFilter()核心过滤方法

filter生命周期方法中参数:(了解)

方法:init(FilterConfig config)  
参数:filterConfig   当前filter的配置对象
作用: 1 可以获取到当前filter的名称   getFilterName()
      2 可以获取到ServletContext对象 getServletContext()

方法:doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain)
参数:request response  filterChain
作用:request response之前怎么用 在filter中还怎么用
      filterChain可以做当前filter的放行  放行方法:filterChain.dofilter(req,res)
@WebFilter(urlPatterns = "/*")
public class MyFilter3 implements Filter {
    @Override  //出生:服务器启动执行
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("1111111111");
        //FilterConfig:filter的配置信息对象
        // 1 filter的名字获取
        System.out.println(filterConfig.getFilterName());
        // 2 servletcontext对象获取
        System.out.println(filterConfig.getServletContext());
    }

    @Override //核心方法 进行拦截过滤的方法 匹配一次 执行一次
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("我拦截了浏览器访问服务器的请求...33333");
        //放行(固定代码)  默认不写是不放行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override //死亡:服务器关闭执行
    public void destroy() {
        System.out.println("2222222222222");
    }
}

4)Filter的配置

1.filter的资源路径配置

有3种方式来配置filter的拦截路径
完全路径匹配: 以/开始    例如:/a   /a/sd1       
注意:url-pattern可以写多个

目录匹配:以/开始 以*结尾  例如:/*  /a/*         


扩展名匹配:不以/开始 以.结尾  例如:*.do *.action

2.filter的拦截方式

默认:filter只拦截浏览器过来的请求 不拦截服务器内部的请求

如果想让filter拦截服务器内部的请求:
1:xml方式配置
在<filter-mapping>的标签中添加标签<dispatcher>FORWARD</dispatcher>
但是这种配置将filter默认的拦截方式给覆盖了 只会连接服务器内部的请求 不会再拦截默认的浏览器请求了
想让让filter拦截服务器内部的请求又拦截浏览器过来的请求:
  <filter-mapping>
        <filter-name>MyFilter2</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>FORWARD</dispatcher>  配置拦截服务器内部请求
        <dispatcher>REQUEST</dispatcher>  配置拦截浏览器的请求
</filter-mapping>


2:注解方式配置
@WebFilter(dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
该注解配置既会拦截浏览器过来的请求 又会拦截服务器内部的请求

Listener(监听器)

概述

1)什么是监听器?

servlet:本质上是一个类,实现了java的servlet规范,可以进行浏览器请求的接受和给浏览器响应
filter: 本质上是一个类,实现了java的filter规范,可以对浏览器访问服务器资源时的一种拦截
listener:本质上是一个类,实现了java的各种监听器规范,可以监听其它对象(域)的状态变化(创建 销毁)

2)监听器的作用

作用:就会为了监听servletContext,request,session三大域对象的状态变化
													三个域对象的创建和销毁

3)java提供的监听器规范

java为我们提供了监听器规范,不同的监听器规范要监听的内容不一样

监听三个域对象的创建和销毁:

ServletContextListener(掌握)
					----后期框架的配置文件在服务器启动就执行
ServletRequestListener
HttpSessionListener

监听器的使用

1 编写一个类,实现listener接口
2 去web.xml/注解里面做配置

监听servletContext的创建和销毁:ServletContextListener

创建:服务器只要一开启,就为每个项目创建一个对应的ServletContext对象
销毁: 服务器只要一关闭,就销毁ServletContext对象

代码实现:

// 监听servletContext对象的创建和销毁   实现java提供的监听器规范(ServletContextListener)
//@WebListener
public class ServletContextLoaderListener implements ServletContextListener {

    @Override  //当servletContext对象被创建了 监听器触发 该方法执行
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("servletContext对象被创建了...");

        // 让服务器一加载 就读取框架的配置信息 进行加载
        ServletContext servletContext = servletContextEvent.getServletContext();
        String value = servletContext.getInitParameter("spring");
        System.out.println("就可以正式根据获取到的配置文件名,对该文件的内容进行加载了:"+value);
        System.out.println("正在加载该配置文件中....");

    }

    @Override //当servletContext对象被销毁了 监听器触发 该方法执行
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("servletContext对象被销毁了...");
    }
}

监听ServletRequest的创建和销毁:ServletRequestListener

创建: 浏览器每次访问服务器就会创建request对象
销毁: 服务器响应给浏览器的时候该request对象销毁

代码实现:

// 监听request对象的创建和销毁   实现java提供的监听器规范(ServletRequestListener)
//@WebListener
public class RequestLoaderListener implements ServletRequestListener{

    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        
        System.out.println("request对象销毁了。。");
    }

    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        
        System.out.println("request对象创建了。。");
    }
}

监听HttpSession的创建和销毁:HttpSessionListener

创建:第一次调用request.getSession 创建session对象
销毁:
默认不用30分钟后自动销毁或者主动销毁session.invalidate()

代码实现:

// 监听session对象的创建和销毁   实现java提供的监听器规范(HttpSessionListener)
@WebListener
public class SessionLoaderListener implements HttpSessionListener {


    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("session创建了...");

    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("session销毁了...");
    }
}
上一篇:【无标题】


下一篇:iptables学习笔记