【Servlet】Listener监听器接口与Filter过滤器接口

【Servlet】Listener监听器接口与Filter过滤器接口

一、Listener接口

1、介绍
  • 一组来自于Servlet规范下的接口,共有8个接口。在Tomcat存在servlet-api.jar包
  • 监听器接口需要由开发人员钦此实现,Http服务器提供jar包并没有对应的实现类
  • 监听器接口用于监控【作用域对象生命周期变化时刻】以及【作用域对象共享数据变化时刻】
2、作用域对象
3、监听器接口实现类开发规范(步骤)

(1)根据监听的实际情况,选择对应监听器接口进行实现

(2)重写监听器接口声明【监听事件处理方法】

(3)在web.xml文件将监听器接口实现类注册到Http服务器

4、ServletContextListener接口
  • 作用:通过这个接口合法的检测全局作用域对象被初始化时刻以及销毁时刻

  • 监听事件处理方法:

    public void contextInitialized() // 在全局作用域对象被Http服务器初始化被调用

    public void contextDestory() // 在全局作用域对象被Http服务器销毁时触发调用

5、ServletContextAttributeListener接口
  • 作用:通过这个接口合法的检测全局作用域对象共享数据变化时刻

  • 监听事件处理方法:

    public void contextAdd() // 在全局作用域对象添加共享数据

    public void contextReplaced() // 在全局作用域对象更新共享数据

    public void contextRemove() // 在全局作用域对象删除共享数据

6、实验案例
  • 文件目录结构
    在这里插入图片描述

  • OneServlet.java

    package com.Etui.Controller;
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.annotation.*;
    import java.io.IOException;
    
    @WebServlet(name = "OneServlet", value = "/one")
    public class OneServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            ServletContext servletContext = request.getServletContext();
    
            // 向全局作用域添加属性
            servletContext.setAttribute("key1", 123);
            // 修改全局作用域属性
            servletContext.setAttribute("key1", 456);
            // 移除全局作用域属性
            servletContext.removeAttribute("key1");
    
        }
    }
    
  • OneListener.java

    package com.Etui.listener;
    
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    
    public class OneListener implements ServletContextListener {
        @Override
        public void contextInitialized(ServletContextEvent servletContextEvent) {
            System.out.println("ServletContext全局作用域被创建");
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent servletContextEvent) {
            System.out.println("ServletContext全局作用域被销毁");
        }
    }
    
  • TwoListener.java

    package com.Etui.listener;
    
    import javax.servlet.ServletContextAttributeEvent;
    import javax.servlet.ServletContextAttributeListener;
    
    public class TwoListener implements ServletContextAttributeListener {
        @Override
        public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
            System.out.println("已向全局作用域添加属性!");
        }
    
        @Override
        public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
            System.out.println("已修改全局作用域中的属性!");
        }
    
        @Override
        public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
            System.out.println("已从全局作用域移除属性!");
        }
    }
    
  • 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.Etui.listener.OneListener</listener-class>
        </listener>
        <listener>
            <listener-class>com.Etui.listener.TwoListener</listener-class>
        </listener>
    </web-app>
    

二、Filter接口

1、介绍
  • Filter位于客户端和处理程序之间,能够对请求和响应进行检查和修改,通常将请求拦截后进行一些通用的操作,例如:过滤敏感词汇、统一字符编码和实施安全控制等。
  • Filter是来自于Servlet规范下的接口,在Tomcat中存在于servlet-api.jar包
  • Filter接口实现类通常由开发人员负责提供,Http服务器不负责提供
  • Filter接口在Http服务器调用资源文件之前,对Http服务器进行拦截
2、具体作用
  • 拦截Http服务器,帮助Http服务器检测当前请求合法性
  • 拦截Http服务器,对当前请求进行增强操作
3、Filter接口实现类开发步骤

(1)创建一个Java类实现Filter接口

(2)重写Filter接口中的doFilter方法

(3)web.xml将过滤器接口实现类注册到Http服务器

4、Filter拦截地址格式
  • 命令格式

    <filter-mapping>
    	<filter-name>oneFilter</filter-name>
    	<url-pattern>拦截地址</url-pattern>
    </filter-mapping>
    
  • 命令作用:拦截地址通知Tomcat在调用何种资源文件之前需要调用OneFilter过滤进行拦截。

  • 要求Tomcat在调用某一个具体文件之前,来调用OneFilter拦截

    <url-pattern>/img/mm.jpg</url-pattern>
    
  • 要求Tomcat在调用某一个文件夹下所有的资源文件之前,来调用OneFilter拦截

    <url-pattern>/img/*</url-pattern>
    
  • 要求Tomcat在调用任意文件夹下某种类型文件之前,来调用OneFilter拦截

    <url-pattern>*.jpg</url-pattern>
    
  • 要求Tomcat在调用网站中任意文件时,来调用OneFilter拦截

    <url-pattern>/*</url-pattern>
    
5、实验案例——Filter在登录验证中的体现
  • 由于案例仅体现Filter在登录验证中的作用,故仅展示Filter相关的源码。

  • 项目目录结构如下:
    在这里插入图片描述

  • UserLoginServlet.java

    package com.powernode.controller;
    
    import com.powernode.dao.UserDao;
    import com.powernode.entity.Users;
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    public class UserLoginServlet extends HttpServlet {
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 设置字符集为utf-8
            request.setCharacterEncoding("utf-8");
            // 获取用户登录信息
            String userName = request.getParameter("userName");
            String password = request.getParameter("password");
    
            // 查询该用户是否存在
            UserDao dao = new UserDao();
            Boolean result = dao.find(userName, password);
    
            // 响应
            if(result) {
                // 登录成功后创建一个session用于标识,以便于OneFilter通过其判断用户是否正常登录
                request.getSession();
                // 重定向至首页
                response.sendRedirect("/myWeb/index.html");
            } else {
                response.sendRedirect("/myWeb/login_error.html");
            }
        }
    }
    
  • OneFilter.java

    package com.powernode.filter;
    
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    import java.util.logging.LogRecord;
    
    public class OneFilter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            // 由于ServletRequest类中没有getSession方法,此时需要将其转换为其子类HttpServletSession
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            HttpServletResponse response = (HttpServletResponse) servletResponse;
    
            // 1、调用请求对象读取请求包中请求行中URI,了解用户访问的资源文件是谁
            String uri = request.getRequestURI(); // [/网站名/资源文件名]
            // 2、如果本次请求资源文件与登录相关,此时应该无条件放行
            if(uri.indexOf("login")!=-1 || "/myWeb/".equals(uri)) {
                filterChain.doFilter(servletRequest, servletResponse);
                return;
            }
            // 获取getSession(), 如果返回值为null说明当前请求中不存在session
            HttpSession session = request.getSession(false);
            if (session != null) {
                // 放行
                filterChain.doFilter(servletRequest, servletResponse);
                return;
            }
            // 当前请求不满足登陆要求,返回错误信息
            request.getRequestDispatcher("/login_error.html").forward(servletRequest, servletResponse);
        }
    
        @Override
        public void destroy() {
    
        }
    }
    
  • 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>
            <filter-name>OneFilter</filter-name>
            <filter-class>com.powernode.filter.OneFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>OneFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    </web-app>
    
  • 运行结果
    请添加图片描述

Over!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
过滤器监听器servlet中的两个重要组件,它们可以帮助我们更好地管理和处理请求和响应。以下是过滤器监听器的配置和运用方法: 1. 过滤器(Filter)的配置和运用: 过滤器用于拦截请求和响应,可以在请求到达servlet之前或者响应返回给客户端之前进行处理。过滤器可以对请求进行拦截、处理和修改,也可以对响应进行拦截、处理和修改,从而实现对请求和响应的控制和管理。 过滤器的配置需要在web.xml文件中进行,例如: ``` <filter> <filter-name>MyFilter</filter-name> <filter-class>com.example.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 这样,MyFilter就会拦截所有的请求。在MyFilter中,可以重写doFilter方法,对请求和响应进行处理和修改。 2. 监听器(Listener)的配置和运用: 监听器用于监听servlet容器中的事件,例如servlet的创建和销毁、session的创建和销毁、attribute的添加和移除等等。通过监听这些事件,我们可以在特定的时刻进行特定的操作,例如在session创建时初始化一些数据、在servlet销毁时释放一些资源等等。 监听器的配置也需要在web.xml文件中进行,例如: ``` <listener> <listener-class>com.example.MyListener</listener-class> </listener> ``` 这样,在MyListener中,可以重写对应的监听器方法,例如: ``` public class MyListener implements HttpSessionListener { public void sessionCreated(HttpSessionEvent event) { // session创建时执行的代码 } public void sessionDestroyed(HttpSessionEvent event) { // session销毁时执行的代码 } } ``` 这样,在session创建和销毁时,就会执行对应的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值