过滤器和监听器

Posted 2324hh

tags:

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

过滤器和监听器都是Web开发中常用的组件,它们可以用来拦截请求和响应,对它们进行处理或修改,并在特定的事件发生时执行相应的操作。

过滤器如何实现功能

1在HttpServletRequest到达 Servlet 之前,拦截客户的HttpServletRequest 。根据需要检查HttpServletRequest,也可以修改HttpServletRequest 头和数据。

2在HttpServletResponse到达客户端之前,拦截HttpServletResponse 。根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

3 Filter接口中有一个doFilter方法,当开发人员编写好Filter,并配置对哪个web资源进行拦截后,Web服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,doFilter方法中有一个filterChain对象,用于继续传递给下一个filter,在传递之前我们可以定义过滤请求的功能,在传递之后,我们可以定义过滤响应的功能 

 

过滤器(Filter)是Java Servlet规范中的一种组件,它可以在请求到达Servlet之前或响应离开Servlet之后对请求和响应进行拦截和处理。过滤器通常用于实现一些通用的处理逻辑,例如:字符编码转换、身份验证、日志记录等。

监听器(Listener)是Java Servlet规范中的另一种组件,它可以监听Servlet容器中的事件,例如Web应用程序的启动、关闭、Session的创建和销毁等。监听器通常用于在处理请求和响应的过程中执行一些特定的操作,例如:初始化一些资源、清理一些资源等。

 

总的来说,过滤器和监听器都可以用来拦截请求和响应,在拦截过程中对它们进行处理或修改,并在特定的事件发生时执行相应的操作。它们的不同之处在于它们的用途和具体实现方式。

监听器和过滤器

过滤器

–过滤器位于客户端和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>

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

过滤器和监听器

Servlet过滤器Filter和监听器

监听器和过滤器

JavaWeb监听器和过滤器

Servlet过滤器和监听器知识总结(转)

过滤器和监听器