深入理解JavaWeb(五)——过滤器和监听器

深入理解JavaWeb(五)——过滤器和监听器

摘要:在基于Java-Web核心技术的开发应用中,为了一些特定的用途或目的,那么Filter和Listener就要闪亮登场了。在本文中我们来聊一聊Servlet规范中的另俩技术的核心知识点,即过滤器和监听器。
作者:来自ArimaMisaki创作

7 Filter

7.1 Filter概述

说明:Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一;过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能,如权限控制、统一编码处理、敏感字符处理等等。

提示:实际上,过滤器交给前端来做比较好。


7.2 Filter基本使用

使用

  1. 定义类并实现Filter接口(javax.servlet.Filter),并重写所有方法
  2. 配置Filter拦截资源的路径,在类上定义@WebFilter注解
  3. 在doFilter方法中输出一句话,并放行

步骤演示

  1. 新建一个filterDemo类,接上接口,重写方法,加上注解

    package web.filter;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;
    
    @WebFilter("/*")
    public class FilterDemo implements Filter {
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("FilterDemo");
    
        }
    
        public void destroy() {
    
        }
    }
    
  2. 新建一个hello.jsp文件

    <%--
      Created by IntelliJ IDEA.
      User: ArimaMisaki
      Date: 2022/10/4
      Time: 14:03
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <h1>hello jsp</h1>
    
        <%
            System.out.println("hello jsp~");
        %>
    </body>
    </html>
    
  3. 开启服务,访问hello.jsp,发现由于没有在doFilter中放行,导致被拦截

    image-20221005133402705

  4. 修改拦截类,添加放行

    package web.filter;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;
    
    @WebFilter("/*")
    public class FilterDemo implements Filter {
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("FilterDemo");
            filterChain.doFilter(servletRequest, servletResponse);
        }
    
        public void destroy() {
    
        }
    }
    
  5. 重新执行步骤3

    image-20221005134639181


7.3 Filter执行流程

说明:在开启服务时,我们可以在拦截的前后都设置处理逻辑,相当于你在地铁站检票,在进站口检票通过了(放行前)允许(放行)进地铁(访问资源),出来还要刷一次出站票(放行后)。

总结来看就是:执行放行前逻辑-》放行-》访问资源-》执行放行后逻辑

image-20221005133721196


7.4 Filter使用细节

说明:可以根据不同的需求配置不同的路径来对资源进行拦截

  • 拦截具体的资源:/index.jsp
  • 目录拦截:/user/*
  • 后缀名拦截:*/.jsp
  • 拦截所有:/*

7.5 过滤器链

说明:一个Web应用可以配置多个过滤器,这多个过滤器称为过滤器链;其中多个过滤器一起使用时需要清楚执行流程,如果你对递归有着足够的熟悉,理解这个对你来说就不是什么难事;此外,通过注解配置的Filter,多个过滤器的先后顺序是按照类名的自然排序(26个字母的排序方式)来确定的。

image-20221005141045675


7.6 Listener

说明:监听器可以监听application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。但由于在现代开发中已经很少使用Listener了,故这里不做过多讲解。

分类

监听器分类监听器名称作用
ServletContext监听ServletContextListener用于对ServletContext对象进行监听
ServletContextAttributeListener对ServletContext对象中的属性的监听
Session监听HttpSessionListener对Session对象的整体状态监听
HttpSessionAttributeListener对Session对象中的属性监听
HttpSessionBindingListener监听对象在Session的绑定和解除
HttpSessionActivationListener对Session数据的钝化和活化的监听
Request监听ServletRequestListener对Request对象进行监听
ServletRequestAttributeListener对Request对象中属性的监听

使用:在使用的时候,只需创建类,接上对应监听器接口,并且重写方法,最后加上@WebListener注解即可使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ArimaMisaki

如果知识有用请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值