Filter&Listener

Filter:过滤器
  1. 概念:
    当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
    过滤器的作用:
      一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤...

  2. 使用:
    1. 定义一个类,实现接口Filter
    2. 复写方法
    3. 配置拦截路径

      1. web.xml配置
        <filter>
          <filter-name>demo1</filter-name>
          <filter-class>com.fgy.web.filter.FilterDemo1</filter-class>
        </filter>
        <filter-mapping>
          <filter-name>demo1</filter-name>
          <!-- 拦截路径 -->
          <url-pattern>/*</url-pattern>
        </filter-mapping>
      2. 注解
        @WebFilter("/*")  //访问所有资源之前,都会执行该过滤器
        public class FilterDemo1 implements Filter {
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
          }
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("filterDemo1被执行了....");
            //放行
            filterChain.doFilter(servletRequest,servletResponse);
          }
          @Override
          public void destroy() {
          }
        }

  3. 过滤器执行流程
    1. 执行过滤器
    2. 执行放行后的资源
    3. 回来执行过滤器放行代码下边的代码
  4. 过滤器生命周期方法
    1. init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
    2. doFilter:每一次请求被拦截资源时,会执行。执行多次
    3. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
  5. 过滤器配置详解
    拦截路径配置:
      1. 具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
      2. 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
      3. 后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
      4. 拦截所有资源:/* 访问所有资源时,过滤器都会被执行
    拦截方式配置:资源被访问的方式
      注解配置:
        设置dispatcherTypes属性
          1. REQUEST:默认值。浏览器直接请求资源
          2. FORWARD:转发访问资源
          3. INCLUDE:包含访问资源
          4. ERROR:错误跳转资源
          5. ASYNC:异步访问资源
         web.xml配置
          设置<dispatcher></dispatcher>标签即可
  6. 过滤器链(配置多个过滤器)
    执行顺序:如果有两个过滤器:过滤器1和过滤器2
      过滤器1 -> 过滤器2 -> 资源执行 -> 过滤器2 -> 过滤器1

    过滤器先后顺序问题:

      1. 注解配置:按照类名的字符串比较规则比较,值小的先执行
      2. web.xml配置: <filter-mapping>谁定义在上边,谁先执行

Listener:监听器
  概念:web的三大组件之一。
    事件监听机制
      事件 :一件事情
      事件源 :事件发生的地方
      监听器 :一个对象
      注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码

  

  类型一: 监听三个作用域创建和销毁

    ServletContextListener:监听ServletContext对象的创建和销毁
      方法:
        void contextDestroyed(ServletContextEvent sce) :ServletContext对象被销毁之前会调用该方法
        void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法
      步骤:
        1. 定义一个类,实现ServletContextListener接口
        2. 复写方法
        3. 配置
          1. web.xml
            <listener>
              <listener-class>com.fgy.web.listener.ContextLoaderListener</listener-class>
            </listener>

          2. 注解:
            @WebListener

        

        例:监听到ServletContext对象的创建时加载ServletContext初始化参数

          配置ServletContext初始化参数:     

            <context-param>                <param-name>name</param-name>                <param-value>value</param-value>            </context-param>

          获取ServletContext初始化参数:

             servletContext.getInitParameter("name");

    HttpSessionListener:......

    ServletRequestListener:......

  类型二: 监听三个作用域属性状态变更

    可以监听在作用域中值 添加  | 替换  | 移除的动作

    ServletContextAttributeListener:

    HttpSessionAttributeListener:

    ServletRequestAttributeListener:

    

  类型三: 监听httpSession里面存值的状态变更  这一类监听器不用配置。 

    HttpSessionBindingListener
      作用:监听对象与session 绑定和解除绑定的动作
      用法:让javaBean 实现该接口即可

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

public class Bean01  implements HttpSessionBindingListener{
    private String name ;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        System.out.println("对象被绑定进来了");
    }
    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        System.out.println("对象被解除绑定");
    }
}

    HttpSessionActivationListener
      作用:用于监听现在session的值是钝化 (序列化, 把内存中的数据存储到硬盘上) 还是活化 (反序列化, 把硬盘中的数据读取到内存中) 的动作。

    session的钝化活化的意义:

      session中的值可能会很多, 并且我们有很长一段时间不使用这个内存中的值, 那么可以考虑把session的值可以存储到硬盘上【钝化】,等下一次在使用的时候,在从硬盘上提取出来。 【活化】

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;

public class Bean02  implements HttpSessionActivationListener , Serializable{
     private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public void sessionWillPassivate(HttpSessionEvent se) {
        System.out.println("session中的值被钝化了...");
    }
    @Override
    public void sessionDidActivate(HttpSessionEvent se) {
        System.out.println("session中的值被活化了...");
    }
}

原文地址:https://www.cnblogs.com/roadlandscape/p/12241722.html

时间: 2024-11-04 20:13:34

Filter&Listener的相关文章

servlet/filter/listener/interceptor区别与联系(转)

由于最近两个月工作比较清闲,个人也比较"上进",利用工作空余时间,也继续学习了一下,某天突然想起struts2和struts1的区别的时候,发现为什么struts1要用servlet,而struts2要用filter呢?一时又发现,servlet和filter有什么区别呢?于是看了看web.xml,一时又发现,咦,servlet.filter.listener?还有个interceptor?对于这几个概念,本应是初学者就掌握的东东了,可惜本人基础学的不好,只能是现在补课.于是就有了这篇

servelt filter listener 的生命周期

1. servlet    当第一次请求一个servlet资源时,servlet容器创建这个servlet实例,并调用他的 init(ServletConfig config)做一些初始化的工作,然后调用它的service方法处理请求.当第二次请求这个servlet资源时,servlet容器就不在创建实例,而是直接调用它的service方法处理请求,也就是说servlet对象是常驻内存的,是单例,因此不要把一些属性作为servlet的成员变量,避免并发访问问题,当servlet容器关闭或者重新加

servlet &amp; filter &amp; listener &amp; interceptor

1.servlet url传来之后,就对其进行处理,之后返回或转向到某一自己指定的页面.它主要用来在业务处理之前进行控制. 2.filter url传来之后,检查之后,可保持原来的流程继续向下执行. filter可用来进行字符编码的过滤,检测用户是否登陆,禁止页面缓存等 3.servlet 与 filter 都是针对url之类的,而listener是针对对象的操作的.如: session的创建,Spring整合Struts,为Struts的action注入属性,web应用定时任务的实现,在线人数

servlet/filter/listener/interceptor过滤器、监听器、拦截器区分

因为之前一直分不清过滤器和拦截器的区别,所以有了两者差不多的错觉,因此在这里总结下servlet/filter/listener/interceptor过滤器.监听器.拦截器. 在此之前先简单回顾下servlet: 概述:servlet是一种运行服务器端的java应用程序,它工作在客户端请求与服务器响应的中间层. 主要作用:在于交互式地浏览和修改数据,生成动态 Web 内容. 访问流程: 1,客户端发送请求至服务器端: 2,服务器将请求信息发送至 Servlet: 3,Servlet 生成响应内

servlet/filter/listener/interceptor区别与联系

由于最近两个月工作比较清闲,个人也比较“上进”,利用工作空余时间,也继续学习了一下,某天突然想起struts2和struts1的区别的时候,发现为什么struts1要用servlet,而struts2要用filter呢?一时又发现,servlet和filter有什么区别呢?于是看了看web.xml,一时又发现,咦,servlet.filter.listener?还有个interceptor?对于这几个概念,本应是初学者就掌握的东东了,可惜本人基础学的不好,只能是现在补课.于是就有了这篇博客. 慢

Filter,Listener(转)

一.Filter的功能filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链). 一个Filter包括: 1).在servlet被调用之前截获; 2).在servlet被调用之前检查serv

SSH框架学习笔记(二)----Filter,Listener以及JSP的新特性

Fileter:对用户请求进行预处理,接着讲请求交给Servlet进行处理并生成响应,最后在对服务器响应进行后处理. 用处: 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest 根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据 在HttpServletResponse到达客户端之前,拦截HttpServletResponse 根据需要检查HttpServletResponse,也可以

【转】servlet/filter/listener/interceptor区别与联系

原文:https://www.cnblogs.com/doit8791/p/4209442.html 一.概念: 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层.最早支持 Servlet 技术的是 JavaSoft 的 Java Web Server.此后,一些其它的基于 Java 的 Web Server 开始支持标准的 Servlet API.Servlet 的主要功能在

spring 中 filter listener servlet 配置

创建 三个类 分别实现 Filter  ServletContextListener  HttpServlet 在springboot 启动类中@bean加入 2 ,实现 ServletContextIntializer接口 @SpringBootApplication public class DemoApplication implements ServletContextInitializer{ public static void main(String[] args) { Spring