【JavaWeb】一文搞懂过滤器、拦截器、监听器

目录

一、过滤器

1.1.过滤器概念

1.2.过滤器工作原理

1.3.过滤器生命周期

1.4.过滤器应用场景

1.5.过滤器使用示例

二、拦截器

 2.1.拦截器概念

 2.2.拦截器工作原理

 2.3.拦截器特点

 2.4.拦截器应用场景

 2.5.拦截器使用示例

三、监听器

 3.1.监听器概念

 3.2.监听器分类

1.ServletContext对象监听器

2.HttpSession对象监听器

3.ServletRequest对象监听器

四、整体流程


一、过滤器

1.1.过滤器概念

        过滤器(filter),在Web开发中,通过Filter,可以对Web服务器管理的JSP,Servlet,静态图片等文件进行拦截,也可以在Web请求到达Servlet之前或响应返回给客户端之前对请求和响应做预处理和后处理,从而实现一些特殊的功能

1.2.过滤器工作原理

        过滤器是基于函数回调实现的

        过滤器(filter)对Web请求进行预处理(如:过滤敏感词汇,设置字符编码等),预处理后将请求交给Servlet进行处理并生成响应,最后filter再对服务器响应进行后处理(如:压缩响应信息等)

1.3.过滤器生命周期

        实例化:Web服务器在部署Web应用时对所有过滤器进行实例化。Web服务器回调无参构造方法

        初始化:Web服务器启动时,会创建Filter对象,然后调用init方法,进行初始化工作。Web服务器回调init()方法,且只调用一次,用于加载资源

        过滤:Web服务器根据每一次的Web请求去校验应用配置文件设置的过滤规则,若满足过滤规则,则对请求/响应进行拦截。Web服务器回调doFilter()方法,可调用多次

        销毁:Web服务器在关闭后,Filter对象被销毁,在正常关闭的情况下,在关闭前会调用destroy方法,进行销毁工作。Web服务器回调destroy()方法,且只调用一次,用于释放资源

1.4.过滤器应用场景

  • 过滤敏感词汇
  • 设置字符编码
  • 权限访问控制
  • 压缩响应信息

1.5.过滤器使用示例

// Web.xml配置
<filter>
    <filter-name>Encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>Encoding</filter-name>
    <url-pattern>/</url-pattern>
</filter-mapping>


// 代码示例
import javax.servlet.*;
import java.io.IOException;

public class DemoFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        long startTime = System.currentTimeMillis();
        chain.doFilter(request, response);
        long endTime = System.currentTimeMillis();
        System.out.println("Request processed in " + (endTime - startTime) + " ms");
    }

    @Override
    public void destroy() {
        // 销毁
    }
}

二、拦截器

        2.1.拦截器概念

        拦截器(Interceptor),这里指的是Spring中的拦截器,是对过滤器更加细化的应用,是Spring框架提供的一种更加灵活的拦截器机制,他不依赖于Servlet容器,依赖于Spring框架,是AOP的一种体现,底层基于Java的动态代理实现,不仅可以在Service方法前后还可以应用到其他方法的前后进行拦截,并且一个应用中可以同时存在多个拦截器,一个请求也可以触发多个拦截器,每个拦截器会根据它被声明的顺序依次被调用

        2.2.拦截器工作原理

        拦截器是基于Java反射机制,属于面向切面编程(AOP)的一种应用

        拦截器是在请求进入Servlet后,在进入Controller之前进行预处理,Controller渲染了对应的视图之后结束

        2.3.拦截器特点

  •  拦截器基于Java反射机制(动态代理)实现
  •  拦截器是Spring特有的,能使用Spring的任何资源
  •  拦截器可以用于Web程序、Application和Swing程序
  •  拦截器可以在方法的前后,异常抛出的前后对方法进行增强,作用范围广

        2.4.拦截器应用场景

  •  登录校验,校验用户是否已登录
  •  权限验证,校验用户是否有权限访问
  •  记录日志,记录请求日志(用户IP、请求时间等)
  •  性能监控,监控请求时长

        2.5.拦截器使用示例

     拦截器实现步骤:

  1. 自定义拦截器,并实现HandlerInterceptor接口
  2. 重写preHandlepostHandleafterComletion方法
  3. 配置类注册拦截器,实现WebMvcConfigurer接口并重写addInterceptors方法
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class SimpleInterceptor implements HandlerInterceptor {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 在请求处理之前进行调用(Controller方法调用之前)
        System.out.println("Before Controller method");
        return true; // 只有返回true才会继续向下执行,返回false取消当前请求
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        // 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
        System.out.println("After Controller method, before view rendering");
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // 在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行(主要用于进行资源清理工作)
        System.out.println("After view rendering");
    }
}



// 拦截器 注入
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SimpleInterceptor()).addPathPatterns("/**");
    }
}

三、监听器

        3.1.监听器概念

        监听器是JavaEE规范中的一部分,它能够监听Web应用中的事件,如ServletContext的初始化和销毁、Session的创建和销毁等。在Spring Boot中,监听器通常用于进行一些全局性的资源初始化或清理工作

        3.2.监听器分类

1.ServletContext对象监听器

       主要监听ServletContext的创建,需要实现ServletContextListener接口,在整个Web服务中只有一个,并在Web服务关闭时销毁,可配合Redis做数据缓存,从而减轻数据库的压力,提高系统响应速度

        ServletContextListener:用于对Servlet整个上下文进行监听(创建、销毁)

        ServletContextAttributeListener:用于对Servlet上下文属性进行监听(增删改属性)

@WebListener
@Slf4j
public class MyServletContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        log.info("MyServletContextListener contextInitialized has called");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        log.info("MyServletContextListener contextInitialized has called");
    }
}

2.HttpSession对象监听器

        主要监听Session的创建,需要实现HttpSessionListener接口,在会话起始时创建,当一端关闭会话后销毁,可用于获取在线用户数量

        HttpSessionListener接口:Session整体状态的监听

        HttpSessionAttributeListener接口:session属性监听

@WebListener
@Slf4j
public class MyHttpSessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        log.info("MyHttpSessionListener sessionCreated has called");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        log.info("MyHttpSessionListener sessionDestroyed has called");
    }
}

3.ServletRequest对象监听器

        主要监听Request的创建,需要实现ServletRequestListener接口,在客户发送请求时创建,在请求处理完毕时销毁,可用于封装请求数据、用户信息等

        ServletRequestListener:用于对Request请求进行监听(创建、销毁)

        ServletRequestAttributeListener:Request属性的监听(增删改属性)

@WebListener
@Slf4j
public class MyServletRequestListener implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        log.info("MyServletRequestListener requestDestroyed has called");
    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        log.info("MyServletRequestListener requestInitialized has called");
    }
}

四、整体流程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码农的日常生活c

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值