监听器与过滤器

代理设计模式

当某个事件发生某一个事件时,通知另一个对象,让另一个对象做某事

监听器

定义

监听某个对象的状态变化的组件

  • 事件源
    • request
    • session
    • servletContext
  • 监听器 监听事件的对象
  • 注册监听器 与事件源绑定
  • 响应处理

监听器划分

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

  • ServletContextListener
  • HttpSessionListener
  • ServletRequestListener

三个监听域对象当中属性变化

  • ServletContextAttributeListener
  • HttpSessionAttributeListener
  • ServletRequestAttributeListener

域监听器

ServletContext域监听器

ServletContext域的生命周期,服务器启动时创建服务器关闭时销毁。

步骤

  1. 实现接口
  2. 覆盖监听器的方法
  3. web.xml进行配置
// Java
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;

public class Listener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent sce){
        System.out.println("创建了");
    }

    public void contextDestroyed(ServletContextEvent sce){
         System.out.println("销毁了");
    }
}

//xml
<listener>
        <listener-class>tashi.Listener</listener-class>
    </listener>

HttpSession域的创建与销毁的监听器

HttpSession域的生命周期,第一次调用request.getSession()调用,服务器关闭session或手动销毁关闭。

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class SessionLisener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("Session创建");
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("Session销毁");
    }
}

//xml
<listener>
        <listener-class>tashi.SessionLisener</listener-class>
</listener>

ServletRequestListener

同理,监听请求对象的创建域销毁

对象存储监听

  • ServletContextAttributeListener
  • HttpSessionAttributeListener
  • ServletRequestAttributeListener

ServletContextAttributeListener

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;

public class AttributeListenerTest implements ServletContextAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        //添加
        System.out.println("添加\t");
        System.out.println(scae.getName()+"\t"+scae.getValue()+"\t"+scae.getSource());
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae) {
        //删除
        System.out.println("删除\t");
        System.out.println(scae.getName()+"\t"+scae.getValue()+"\t"+scae.getSource());
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae) {
        //更新
        System.out.println("更新\t");
        System.out.println(scae.getName()+"\t"+scae.getValue()+"\t"+scae.getSource());

    }
}

//Servlet
@WebServlet("/index")
public class Download extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.getServletContext().setAttribute("Pets", "MIaoMiao");
    }
}

过滤器

是什么

filter时客户端对访问资源的过滤,对目标资源访问前后进行逻辑处理。它负责拦截请求与响应,便于查看客户机与服务器之间交换的数据

步骤

  1. 编写一个过滤器类实现Filter接口
  2. 实现接口中尚未实现的方法
  3. web.xml进行配置
//过滤器
import javax.servlet.*;
import java.io.IOException;

public class T1 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("来到了过滤器");

        filterChain.doFilter(servletRequest,servletResponse);//放行
    }

    @Override
    public void destroy() {

    }
}
//web.xml
<filter>
        <filter-name>T1</filter-name>
        <filter-class>tashi.filter.T1</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>T1</filter-name>
        <url-pattern>/Download</url-pattern>
</filter-mapping>

解析

当我们发送一个请求的时候,web容器会先到filter当中 创建三个参数,req,resp,filterChain。在过滤器当中放行之后才可以访问对应的servlet类

中间的过滤器可以有多个,在一个过滤器当中可以调用另外一个过滤器。

在配置xml时,首先定义过滤器的名称和Java类名,然后用 url-pattern 映射工作空间的目录

filter的生命周期

  • init方法

当filter对象创建时调用。服务器启动时创建。

- 参数 filterConfig
  • dofilter方法

    用于处理请求和响应,当请求与过滤器相关联web资源时 进行调用

  • destroy方法

filter对象销毁时调用。服务器关闭会销毁

应用实例

需要对某些IP进行访问限制,不让非法的IP访问系统,需要用到过滤器限制


  转载请注明: linis 监听器与过滤器

 上一篇
Cookie与Session Cookie与Session
CookieCookie是一种在客户端保存信息的技术。Servlet使用java.servlet.Cookie 封装一个Cookie信息。在ServletResponse接口中定义了addCookie方法 在ServletRequest接口
2019-04-22
下一篇 
HTML-定位 HTML-定位
关于元素定位的核心概念构建块CSS采用盒子模型来处理每一个HTML元素,盒子可以是一个“块级”盒子,也可以是一个“内联”盒子 包含元素如果一个块级元素位于另一个块级内部,那么这个外部的框就成为父元素 控制元素的位置CSS中包含三种用于控制页
2019-04-22
  目录