监听器和过滤器

Posted XiaoFanMi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了监听器和过滤器相关的知识,希望对你有一定的参考价值。

过滤器

–过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求

–在请求到达Servlet/JSP之前,过滤器截获请求。

在这里插入图片描述

•Servlet API 中,与过滤器有关的API共有三个接口,分别是

​ –Filter

​ –FilterChain

​ –FilterConfig

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

public class EcodingFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");//执行统一的编码
        //让请求继续向下执行,到达过滤链上的下一个资源(可能是过滤器,也可能是目标资源)
        filterChain.doFilter(servletRequest,servletResponse);

    }
}

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*验证用户已经登录*/
public class IsLoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String acount = (String) request.getSession().getAttribute("account");
        System.out.println("用户是否登录过滤器");
        if (acount == null) {
            response.sendRedirect("login.jsp");
        } else {
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }
}

我们在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">

    <!-- 配置过滤器-->
    <filter>
        <filter-name>isLoginFilter</filter-name>
        <filter-class>com.filter.IsLoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>isLoginFilter</filter-name>
        <url-pattern>/success.jsp</url-pattern> <!-- 配置允许进入到过滤器的请求地址-->
    </filter-mapping>

    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>com.filter.EcodingFilter</filter-class><!-- 文件的绝对路径 -->
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern> /* </url-pattern>  <!-- /*表示访问本项目中的任何资源,都进入编码过滤器-->
    </filter-mapping>

    <!-- 配置session失效时间  以分钟为单位-->
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

</web-app>

过滤器总结:

过滤器用来实现通用的功能,减少代码冗余,提高可维护性

一个过滤器可以配置给多个资源使用

一个资源也可以配置多个过滤器,按照配置顺序调用

监听器

Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件。

按监听对象分类:

  1. 用于监听应用程序对象(ServletContext)
  2. 用于监听用户会话对象(HttpSeesion)
  3. 用于监听请求消息对象(ServletRequest)

按监听事件分类:

  1. 监听对象的创建和销毁的事件监听器。
  2. 监听对象属性变更(添加,修改,移除)的监听器。

Servlet API中定义了监听器接口,用来监听不同的事件类型

–ServletContextListener:上下文监听器。

–ServletContextAttributeListener:上下文属性监听器。

–ServletRequestListener:请求监听器。

–ServletRequestAttributeListener:请求属性监听器。

–HttpSessionListener:会话监听器。

–HttpSessionAttributeListener:会话属性监听器。

import javax.servlet.*;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.Date;

/*
监听器:监听servletContext.HttpSession和ServletRequest等域对象的创建和销毁事件
servletContext:生命周期开始服务器启动,结束于服务器关闭
HttpSession:开始于会话创建,结束于1.服务器关闭  2.30分钟未操作  3.强制销毁
 ServletRequest:开始于请求,结束于服务器向客户端做出响应
 */
public class ObjectServlet implements ServletContextListener, HttpSessionListener, ServletRequestListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContext创建");
        ServletContext context = sce.getServletContext();
        context.setAttribute("name", "1");
        context.setAttribute("name", "1");
        context.removeAttribute("name");
    }

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

    long s;

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        s = System.currentTimeMillis();
        System.out.println("ServletRequest创建");
    }

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println(sre.getServletRequest().getLocalAddr() + ":::" + (new Date().getTime() - s));
        System.out.println("ServletRequest销毁");
    }

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

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("session销毁");
    }
}

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
/*
监听对象属性是否发生修改
*/
public class AttributeEvent implements ServletContextAttributeListener, HttpSessionAttributeListener, ServletRequestAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        System.out.println("添加属性" + scae.getName() + "::" + scae.getValue());
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae) {
        System.out.println("删除属性" + scae.getName() + "::" + scae.getValue());
        
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae) {
        System.out.println("更改属性" + scae.getName() + "::" + scae.getValue());
    }

}

创建监听器类,实现监听器接口,在web.xml文件中配置监听器类。

<listener><listener-class>

  		 监听器类全类名

​	</listener-class>

</listener>

以上是关于监听器和过滤器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用事件侦听器来加载动画片段的循环

JavaFX窗口拖动

listview OnItemClick 侦听器在片段中不起作用

第三十五章——过滤器和监听器

在同一个片段中实现多个事件监听器 - Android

片段 - 全局视图变量与本地和内部类侦听器和内存泄漏