代码编织梦想

过滤器、监听器和拦截器的使用

一、过滤器、监听器和拦截器总览

过滤器(Filter)监听器(Listener)拦截器(Interceptor)
关注点web请求系统级别参数、对象Action(部分web请求)
如何实现函数回调事件Java反射机制(动态代理)
应用场景设置字符编码、URL级别的权限访问控制、过滤敏感词汇、压缩响应信息统计网站在线人数、清除过期session拦截未登录用户、审计日志
是否依赖servlet容器依赖不依赖
servlet提供的支持Filter接口ServletContextListerner抽象接口、HttpSessionListener抽象接口Action(部分web请求)、HandlerinterceptorAdapter类
Spring提供的支持HandlerInterceptor接口
级别系统级系统级非系统级

二、过滤器、监听器和拦截器详解

拦截器(interceptor)

  • 拦截器是一种面向方面/切面编程(AOP Aspect-Oriented Programming).
  • 面向切面就是将多个模块的的通用服务进行分离,如权限管理、日志服务,他们在多个模块中都会用到,就可以将其各自封装为一个可重用模块。而这些通用服务的具体实现是通过拦截器来完成,比如用户客户端访问一些保密模块都应先通过权限审查的拦截器来进行权限审查,确定用户是否具有该项操作的权限后方能向下执行。
package org.springframework.web.servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.ModelAndView;

public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }

    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

过滤器(filter)

  • 过滤器处于客户端与Web资源(Servlet、JSP、HTML)之间,客户端与Web资源之间的请求和响应都要通过过滤器进行过滤。举例:在过滤器中定义了禁止访问192.10.10.1这个地址,那么当客户端发出访问192.10.10.1的请求时,经过过滤器后,客户端得到的响应是出现该IP禁止访问的提示。
  • 在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉)。
public class MyFilter implements Filter {

    /**
     * 初始化
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {


    }

    /**
     * 过滤器拦截
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    }

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

    }
}

过滤器和拦截器的区别

  • 拦截器是基于java反射机制的,而过滤器是基于函数回调。
  • 拦截器不依赖于Servlet容器,而过滤器依赖于servlet容器。
  • 拦截器只能对action请求起作用,而过滤器可以对几乎所以的请求起作用。
  • 拦截器可以访问action上下文,值栈里的对象,而过滤器不能。
  • 在Action的生命周期周,拦截器可以被多次调用,而过滤器只能在容器初始化的时候被调用一次。

**执行顺序 :**过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。

在这里插入图片描述

在这里插入图片描述

**过滤器:**是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符.

**拦截器 :**是在面向切面编程的就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

listener监听器

JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
监听ServletContext对象的创建和销毁?实现:ServletContextListener 接口,根据要求重写创建和销毁的方法。

package java.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * 监听ServletContent对象的创建和销毁
 */
public class MyServletContextListener implements ServletContextListener {
    /**
     * 对象创建
     * @param sce
     */
    public  void contextInitialized(ServletContextEvent sce) {
    }
    /**
     * 对象销毁
     * @param sce
     */
    public  void contextDestroyed(ServletContextEvent sce) {
    }

}

Java Web开发中的监听器(listener)就是由application、session、request三个对象创建、销毁或者往其中添加、修改、删除属性时自动执行代码的功能组件

  • ServletContextListener:对Servlet上下文的创建和销毁进行监听。
  • ServletContextAttributeListener:监听Servlet上下文属性的添加、删除和修改。
  • HttpSessionListener:对Session的创建和销毁进行监听。
  • HttpSessionAttributeListener:对Session对象中属性的添加、删除和修改进行监听。
  • HttpSessionBindingListener:监听Http会话中对象的绑定信息。
  • HttpSessionActivationListener:监听器监听Http会话的情况。
  • ServletRequestListener:对请求对象的初始化和销毁进行监听。
  • ServletRequestAttributeListener:对请求对象属性的添加、删除和修改进行监听。
监听对象监听接口监听事件
ServletRequestServletRequestListenerServletRequestEvent
ServletRequestAttributeListenerServletRequestAttributeEvent
HttpSessionHttpSessionListenerHttpSessionEvent
HttpSessionActivationListener
HttpSessionAttributeListenerHttpSessionBindingEvent
HttpSessionBindingListener
ServletContextServletContextListenerServletContextEvent
ServletContextAttributeListenerServletContextAttributeEvent
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_46616045/article/details/128820675

springboot入门(4)——filter,listener_魔术兔的博客-爱代码爱编程

1.springboot 创建监听器和过滤器2.创建过滤器3.创建监听器4.结果 1.springboot 创建监听器和过

spring boot : 使用 zuul 实现 api gateway 的路由和过滤 ( routing and filtering )_禅与计算机程序设计艺术的博客-爱代码爱编程

Spring Boot : 使用 Zuul 实现 API Gateway 的路由和过滤 ( Routing and Filtering ) image.png 本节通过使用 Netflix Zuul 实现微服应用中的路由(简单代理转发)和过滤功能。

java商城项目(微服务框架)——第7天nginx+cors解决跨域+品牌+分类查询_就叫一片白纸的博客-爱代码爱编程

0.学习目标 使用资料搭建后台系统 会使用nginx进行反向代理 实现商品分类查询功能 掌握cors解决跨域 实现品牌查询功能 1.搭建后台管理前端 1.1.导入已有资源 后台项目相对复杂,我们不再从0搭建项目,而是直接使用

Day1:SpringBoot入门学习——传智播客学习笔记【微服务电商】-爱代码爱编程

1.了解SpringBoot 什么是SpringBoot 为什么要学习SpringBoot SpringBoot有什么特点 1.1 什么是SpringBoot 用固定的方式构建一个生产级别的Spring应用(什么是固定方式,即构建所需要的配置,环境等条件都被封装好了),SpringBoot推崇约定大于配置的方式,让我们尽可能快的启动并运行程序(约

【javaWeb微服务架构项目——乐优商城day13】——无状态登陆,jwt+rsa,搭建授权中心,jwtUtils,登陆功能,首页用户名回显,在zuul网关添加过滤器-爱代码爱编程

文章目录 0.学习目标1.无状态登录原理1.1.什么是有状态?1.2.什么是无状态1.3.如何实现无状态1.4.JWT1.4.1.简介1.4.2.数据格式1.4.3.JWT交互流程1.4.4.非对称加密1.5.结合Zuul的鉴权流程1.5.1.没有RSA加密时1.5.2.结合RSA的鉴权2.授权中心2.1.创建授权中心2.1.1.创建父module

SpringBoot下使用Security-爱代码爱编程

该文基于SpringBoot版本2.1.8.RELEASE,测试代码仓库地址:https://github.com/Uetty/spring-boot-clean/tree/security,主要在security命名的分支之下,可以点到release查看代码案例列表,或拉取整个仓库代码在IDE中直观地查看所有分支提交历史。 这篇文章能帮助你什么?如果你

SpringBoot——Web开发-爱代码爱编程

SpringBoot——Web开发 一、SpringBoot对静态资源的映射规则1、webjars的方式2、/**3、首页映射4、网页图标5、静态资源属性配置二、模板引擎1、引入Thymeleaf2、Thymeleaf的使用三、SpringMVC自动配置1、SpringBoot为SpringMVC提供的自动配置2、SpringMVC的扩展配置四、R

Springboot入门到精通(超详细文档)-爱代码爱编程

1. Spring Boot是什么 我们知道,从 2002 年开始,Spring 一直在飞速的发展,如今已经成为了在Java EE(Java Enterprise Edition)开发中真正意义上的标准,但是随着技术的发展,Java EE使用 Spring 逐渐变得笨重起来,大量的 XML 文件存在于项目之中。繁琐的配置,整合第三方框架的配置问题,导致了

SpringBoot——自学笔记-爱代码爱编程

SpringBoot——自学笔记 学习视频B站狂神说:https://www.bilibili.com/video/BV1PE411i7CV 1、springboot自动装配原理浅理解 在编写springboot项目时,主项目会有一个@SpringBootApplication,在这个注解的源码中包含了三个主要注解 @SpringBoo

Java微服务篇2——SpringCloud-爱代码爱编程

Java微服务篇2——SpringCloud 1、微服务架构 1.1、单体应用架构 的⽤户量、数据量规模都⽐较⼩,项目所有的功能模块都放在一个工程中编码、 编译、打包并且部署在一个Tomcat容器中的架构模式就是单体应用架构,这样的架构既简单实 ⽤、便于维护,成本⼜低,成为了那个时代的主流架构⽅式。 优点 高效开发:项⽬前期开发节奏快,团队成员少

SpringBoot-爱代码爱编程

SpringBoot 1.概述 1.1 为什么需要springboot? 现有的SSM(spring+springMVC+mybatis)框架存在的问题 大量的maven冗余配置,依赖每次构建项目都需要花费大量时间来编写大量的相同配置整合第三方技术都需要编写相关配置文件项目测试每次都需要部署到Tomcat1.2 引言 Spring Boot是由P

狂神说——springboot学习_springboot 狂神说-爱代码爱编程

spring官网 SpringBoot官网 spring-security版本下载 狂神官网学习 也可以搜索B站 (狂神说) 学习网站:https://www.bilibili.com/video/BV1PE411i7CV?

springboot管理项目笔记-爱代码爱编程

一、搭建后台管理系统框架 步骤: 1.将静态资源导入/resource/static文件夹中 (静态资源只有js/css/img/font这些文件夹,html页面不放入) 2.login.html index.html导入

java web笔记_决定网页外观(如字体字号颜色等)的是-爱代码爱编程

1,前端HTML,CSS,JavaScript的区别作用 HTML:决定网页页面上显示的内容 CSS:决定网页页面上的美观层度(比如修改字体,字号,字体颜色等) JavaScript:决定网页页面特效,通常用来给网页添加格