Filter(过滤器)+Listener(监听器)

一.Filter(过滤器)

1.基本概念

1.1.Filter本意为”过滤“的含义,是JavaWeb的三大组件之一,三大组件为:Servlet、Filter、Listener。

1.2.过滤器是向 Web 应用程序的请求和响应处理添加功能的 Web 服务组件。

1.3过滤器相当于浏览器与Web资源之间的一道过滤网,在访问资源之前通过一系列的过滤器对请求进行修改、判断以及拦截等,也可以对响应进行修改、判断以及拦截等。

2.工作方式

Filter(过滤器)+Listener(监听器)

3.使用方式

3.1自定义类实现Filter接口并重写doFilter方法。

public class LoginFilter implements Filter {

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException,ServletException {

//TODO 处理逻辑必须调用下面的方法

chain.doFilter(request,response);

}

}

 

3.2在web.xml文件中配置过滤器

filter>

<filter-name>LoginFilter</filter-name>

<filter-class>com.yangshen.LoginFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>LoginFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

二.监听器

1.基本概念

Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理。

容器产生的事件分类如下:

  生命周期相关的事件。 属性状态相关的事件。 存值状态相关的事件。底层原理是采用接口回调的方式实现。

2.基本分类

监听器类型

功能介绍

javax.servlet.ServletRequestListener

监听request作用域的创建和销毁

javax.servlet.ServletRequestAttributeListener

监听request作用域的属性状态变化

javax.servlet.http.HttpSessionListener

监听session作用域的创建和销毁

javax.servlet.http.HttpSessionAttributeListener

监听session作用域的属性状态变化

javax.servlet.ServletContextListener

监听application作用域的创建和销毁

javax.servlet.ServletContextAttributeListener

监听application作用域的属性状态变化

javax.servlet.http.HttpSessionBindingListener

监听对象与session的绑定和解除

javax.servlet.http.HttpSessionActivationListener

监听session数值的钝化和活化

3.代码案例

3.1自定义类实现监听器接口并重写相关的方法

package com.yangshen.demo04;

 

import javax.servlet.ServletContext;

import javax.servlet.ServletContextEvent;

import javax.servlet.ServletContextListener;

import javax.servlet.http.HttpSessionEvent;

import javax.servlet.http.HttpSessionListener;

 

public class OnlineUser implements HttpSessionListener, ServletContextListener {

    // 声明一个ServletContex类型的引用负责作为全局对象来记录当前在线用户的数量通过属性记录

    private ServletContext servletContext = null;

 

    @Override

    public void contextInitialized(ServletContextEvent servletContextEvent) {

        servletContext = servletContextEvent.getServletContext();

    }

 

    @Override

    public void contextDestroyed(ServletContextEvent servletContextEvent) {

        servletContext = null;

    }

 

    @Override

    public void sessionCreated(HttpSessionEvent httpSessionEvent) {

        System.out.println("有新用户上线了...");

        Object count = servletContext.getAttribute("count");

        // 若当前用户为第一个用户则将全局对象中的属性值设置为即可

        if (null == count) {

            servletContext.setAttribute("count", 1);

        }

        // 若当前用户不是第一个用户则将全局对象中原有的数据取出来加后再设置进去

        else {

            Integer integer = (Integer)count;

            integer++;

            servletContext.setAttribute("count", integer);

        }

        System.out.println("当前在线用户数量为:" + servletContext.getAttribute("count"));

    }

 

    @Override

    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {

        System.out.println("有用户已下线...");

    }

}

 

3.2在web.xml中配置监听器

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"

         version="4.0">

   

    <listener>

        <listener-class>com.yangshen.demo04.OnlineUser</listener-class>

    </listener>

</web-app>

3.3在jsp页面显示

<%--

  Created by IntelliJ IDEA.

--%>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

    <title>实现当前在线的用户数量</title>

</head>

<body>

<h1>当前在线用户人数为${applicationScope.count}</h1>

</body>

</html>