Java中的过滤器、拦截器和aop

目录

1、过滤器、拦截器和aop有什么区别及各自的应用场景

2、拦截器和aop的区别是什么

3、举个例子

4、拦截器和过滤器有什么区别


1、过滤器、拦截器和aop有什么区别及各自的应用场景

Java中的过滤器(Filter)、拦截器(Interceptor)和面向切面编程(AOP)各有其特性和应用场景。

  1. 过滤器(Filter):过滤器是Java Servlet规范中定义的一种组件,用于在请求到达目标资源之前或响应返回给客户端之前进行预处理或后处理操作。过滤器可以对请求和响应进行修改、验证、记录日志等操作。过滤器通常被配置为按照特定的URL模式进行拦截,并按照一定的优先级顺序执行。主要应用于web开发,能够拦截HTTP请求和响应。基于Java的函数回调机制,通常用于执行一些通用的任务,如编码设置、压缩响应、检查用户是否登录等。应用场景包括:

    • URL级别的权限访问控制
    • 过滤敏感词汇(防止SQL注入)
    • 设置字符编码
    • 压缩响应信息
  2. 拦截器(Interceptor):拦截器是一种面向方法调用或方法执行的技术。在Java中,拦截器通常与AOP框架结合使用。拦截器可以在方法调用之前、之后或异常发生时插入额外的逻辑。拦截器可以在方法级别或类级别进行配置,并按照一定的顺序依次执行。拦截器的主要应用场景是面向切面编程(AOP),符合横切关注点的功能都可以放在拦截器中来实现。比如日志记录、性能监控等。拦截器基于Java的反射机制,不依赖于servlet容器,能对action请求起作用,可以访问action上下文,值栈里的对象。应用场景包括:

    • 登录验证:判断用户是否登录
    • 权限验证:判断用户是否有权限访问资源
    • 日志记录:记录请求操作日志(用户IP,访问时间等),以便统计请求访问量
    • 处理Cookie、本地化、国际化、主题等
    • 性能监控:监控请求处理时长等通用行为:读取Cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现
  3. 面向切面编程(AOP):AOP是一种编程范式,用于在应用程序运行期间将横切关注点(如日志、事务、安全性等)与核心业务逻辑分离。AOP通过将横切关注点定义为切面(Aspect),并通过特定的方式将切面织入到目标对象中,实现了对目标对象行为的增强。AOP可以在代码级别实现拦截和修改目标对象的行为,而不需要显式地修改目标对象的代码。AOP主要用于实现横切关注点的复用和集中管理。面向切面编程主要解决的是交叉关注点的问题,比如说日志记录、安全性、事务管理等。这些关注点贯穿于系统的各个业务模块中,使用面向切面编程,可以将它们分离出去,从而更好地实现代码复用。应用场景包括:

    • 日志记录:记录请求操作日志(用户IP,访问时间等),以便统计请求访问量
    • 安全性:对敏感词汇进行过滤,防止SQL注入等攻击
    • 事务管理:监控请求处理时长等通用行为:读取Cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现

应用场景:

  • 过滤器:适用于对请求进行预处理和响应进行后处理的场景,如身份验证、授权、日志记录等。
  • 拦截器:适用于对方法调用进行干预的场景,如事务管理、性能监控、权限控制等。
  • AOP:适用于横切关注点的复用和集中管理,如日志记录、事务管理、安全性等。

需要注意的是,过滤器和拦截器通常是通过Java Servlet容器提供的机制来实现的,而AOP则需要使用专门的AOP框架(例如Spring AOP)来支持。

综上所述,过滤器、拦截器和AOP各有其特性和应用场景。过滤器主要用于web开发,拦截器主要用于面向切面编程,AOP则主要用于解决交叉关注点的问题。

2、拦截器和aop的区别是什么

拦截器和AOP在以下四个方面存在区别:

  1. 定义和用途:拦截器是一种设计模式,允许在执行某个操作前后插入自定义的逻辑,常见于各种编程语言和框架,如Java的Servlet过滤器、Spring的拦截器等。AOP是一种编程范式,旨在通过将跨越多个对象和层的功能(称为“切面”)从业务逻辑中解耦出来,实现横切关注点的复用。AOP可以在不修改原始代码的情况下,将切面应用于一个或多个目标对象,以增加特定功能,例如日志记录、事务管理、性能监控等。
  2. 拦截对象:拦截器主要针对URL进行拦截,而AOP针对的是具体的代码,能够实现更加复杂的业务逻辑。
  3. 灵活性:AOP更加灵活,可以对方法进行拦截,也可以对类进行拦截,而拦截器只能对特定的URL或者action进行拦截。
  4. 实现方式:拦截器和AOP都是使用代理模式实现,但AOP还包含一种特殊的代理,即CGLib代理。这种代理可以针对类进行代理,而不仅仅是对接口进行代理。

总结来说,拦截器和AOP在定义和用途、拦截对象、灵活性和实现方式上存在区别。拦截器主要用于过滤和拦截特定URL或action,而AOP主要用于解耦和复用横切关注点。

3、举个例子

在Java的Spring框架中,我们可以创建一个拦截器(Interceptor)来拦截特定的URL。比如,我们可能想要拦截所有访问"/admin"路径的请求,并检查用户是否已经登录。如果没有登录,我们可以重定向用户到登录页面。这种场景下,我们可以创建一个拦截器来实现这个功能。

以下是一个简单的Spring拦截器的例子:

import org.springframework.web.servlet.HandlerInterceptor;  
import org.springframework.web.servlet.ModelAndView;  import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  public class LoginInterceptor implements HandlerInterceptor {  @Override  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  String requestURI = request.getRequestURI();  if (requestURI.contains("/admin") && !isUserLoggedIn(request)) {  // 如果用户未登录,则重定向到登录页面  response.sendRedirect(request.getContextPath() + "/login");  return false;  }  return true;  }  private boolean isUserLoggedIn(HttpServletRequest request) {  // 这里实现检查用户是否已经登录的逻辑  // ...  return false; // 默认情况下,假设用户未登录  }  @Override  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {  // ...  }  @Override  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {  // ...  }  
}

在这个例子中,preHandle方法会在请求处理之前被调用。如果该方法返回false,则请求会被中断。在这个方法中,我们检查了请求URI是否包含"/admin",并且用户是否已经登录。如果条件满足,我们重定向用户到登录页面,并返回false中断请求。否则,我们返回true允许请求继续处理。其他两个方法postHandleafterCompletion也可以根据需要实现额外的逻辑。

在这个例子中,拦截器的工作流程如下:

  1. 当用户发送一个HTTP请求到应用程序时,Spring框架会接收到这个请求。
  2. Spring会检查拦截器链表(Interceptor Chain)中是否有拦截器需要拦截这个请求。在这个例子中,我们定义了一个名为"LoginInterceptor"的拦截器,它实现了HandlerInterceptor接口。
  3. 当请求到达"LoginInterceptor"时,preHandle方法会被调用。在这个方法中,我们检查了请求的URI是否包含"/admin",并且用户是否已经登录。如果条件满足,我们重定向用户到登录页面,并返回false中断请求。
  4. 如果preHandle方法返回true,则请求将继续传递给下一个拦截器(如果有的话)。如果所有拦截器都返回true,则请求将被传递给目标控制器处理。
  5. 在请求处理之后,postHandle方法将被调用。在这个方法中,我们可以对请求进行额外的处理,例如修改响应对象等。
  6. 最后,当请求处理完成时,afterCompletion方法将被调用。在这个方法中,我们可以执行一些清理工作,例如关闭数据库连接等。

通过这种方式,拦截器可以在请求处理之前、之后和完成时执行自定义的逻辑,从而实现诸如登录验证、日志记录等功能。

4、拦截器和过滤器有什么区别

拦截器和过滤器在以下四个方面存在区别:

  1. 实现原理:过滤器基于函数回调,而拦截器基于Java的反射机制(动态代理)。
  2. 使用范围:过滤器实现的是javax.servlet.Filter接口,这个接口是在Servlet规范中定义的,因此过滤器的使用依赖于Tomcat等容器,主要在web程序中使用。而拦截器(Interceptor)是一个Spring组件,由Spring容器管理,并不依赖Tomcat等容器,可以单独使用。
  3. 触发时机:过滤器在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后。拦截器的触发时机则与此不同。
  4. 拦截的请求范围:过滤器执行了两次,而拦截器只执行了一次。

总的来说,拦截器和过滤器在实现原理、使用范围、触发时机和拦截的请求范围等方面存在区别。

过滤器示例(使用Java Servlet API)

import javax.servlet.*;  
import javax.servlet.http.HttpServletRequest;  
import java.io.IOException;  public class MyFilter implements Filter {  @Override  public void init(FilterConfig filterConfig) throws ServletException {  System.out.println("过滤器初始化...");  }  @Override  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {  System.out.println("过滤器开始...");  chain.doFilter(request, response); // 继续向下执行过滤器链表中的下一个过滤器。  System.out.println("过滤器结束...");  }  @Override  public void destroy() {  System.out.println("过滤器销毁...");  }  
}

拦截器示例(使用Spring框架)

import org.springframework.web.servlet.HandlerInterceptor;  
import org.springframework.web.servlet.ModelAndView;  import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  public class MyInterceptor implements HandlerInterceptor {  @Override  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  System.out.println("拦截器开始...");  return true; // 返回true则继续向下执行,返回false则中断请求。  }  @Override  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {  System.out.println("拦截器结束...");  }  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/182621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

97.STL-查找算法 find

目录 STL-查找算法find 1.基本用法: 2.查找自定义类型: 3.查找范围: STL-查找算法find 在C的STL(标准模板库)中,find 算法用于在指定范围内查找指定值的元素。 功能描述: 查找指定元素&…

YOLOV8解读及推理代码

YOLOV8解读及推理代码 YOLOV8前言性能对比新的骨干网络新的 Ancher-Free 检测头新的损失函数环境配置训练基于python脚本基于命令行 推理pt模型推理onnx模型推理 YOLOV8 前言 YOLOv8并非一个全新的目标检测网络,而是在YOLOv5的基础上进行了升级。其主要升级包括&am…

ASCII sorting

描述 输入一个字符串&#xff0c;对其字符进行排序&#xff0c;输出其字符按ASCII码升序排列。 输入 无空格字符串 输出 按ASCII码升序输出其字符。 样例输入 and 样例输出 adn code&#xff08;c版本&#xff09; #include<stdio.h> #include<stdlib.h> // qs…

LeetCode [中等]和为 K 的子数组

给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 思路&#xff1a; sum: 当前位置的累积和。 如果以当前位置为结尾的数组中&#xff0c;存在和为k的子数组&#xff0c;那么&#xff…

c++之STL

首先我们来仔细研究string 首先我们需要实现string的构造函数和析构函数。有new就有delete. 然后我们实现size()和c_str()&#xff0c;其中c_str就是可以将string类型转换为char*类型返回。 通过运算符重载&#xff0c;我们就可以实现string的[]访问。 然后我们实现和append。 …

超声波水表的量程比是多少?

超声波水表是现代智能水表中的一种重要类型&#xff0c;它采用超声波技术来测量水流速度和体积。量程比作为超声波水表的一个重要指标&#xff0c;决定着其在不同流量范围内的测量性能和准确度。那么&#xff0c;超声波水表的量程比是多少呢&#xff1f; 量程比是指超声波水表最…

2.安装docker

目录 1 安装依赖 2 安装docker 3 测试 目前docker分为三类 Docker-CE(社区版),Docker-EE(企业版)和Moby。Moby是docker社区用户自己写的&#xff0c;所以Moby我们一般用不上 每一类的每一个版本中都有Edge与Stable版&#xff0c;Stable维护4个月&#xff0c;Edge维护1个…

u8g2图形库——丝滑菜单制作

目录 一、实物效果展示 二、丝滑菜单实现原理 三、代码开源 1.ui_bmp.h 2.ui.h 3.ui.c 一、实物效果展示 u8g2图形库——丝滑菜单制作 二、丝滑菜单实现原理 int ui_run(short *a,short *a_tag,uint8_t step,uint8_t slow_cnt) //UI滑动效果 {uint8_t temp;…

试写一算法将两个递增有序的带头结点的单链表合并为一个递增有序的带头结点的单链表。(利用原表结点空间)

试写一算法将两个递增有序的带头结点的单链表合并为一个递增有序的带头结点的单链表。 &#xff08;利用原表结点空间&#xff09; 比如现在要将下面两个链表合并&#xff0c;这里是要求利用原表空间 我们先创建一个辅助的链表L3&#xff0c;用p和q分别标记L1和L2的数据元素&…

L298N模块使用简介

接口作用ENA/ENB使用PWM调节马达转速&#xff08;调速&#xff09;左边一对接口接电机的正负极右边一对接口接电机正负极控制IN1,IN2 控制左边的2个接口的电压&#xff0c;IN1控制一个&#xff0c;IN2控制另外一个 IN1输入3.3V时&#xff0c;OUT1输出3.3v电压&#xff08;可能是…

NoSQL大数据存储技术思考题及参考答案

思考题及参考答案 第1章 绪论 1. NoSQL和关系型数据库在设计目标上有何主要区别&#xff1f; (1)关系数据库 优势&#xff1a;以完善的关系代数理论作为基础&#xff0c;具有数据模型、完整性约束和事务的强一致性等特点&#xff0c;借助索引机制可以实现高效的查询&#xf…

创建Asp.net MVC项目Ajax实现视图页面数据与后端Json传值显示

简述回顾 继上篇文章创建的mvc传值这里说明一下Json传值。在mvc框架中&#xff0c;不可避免地会遇到前台传值到后台&#xff0c;前台接收后台的值的情况&#xff08;前台指view&#xff0c;后台指controller&#xff09;&#xff0c;有时只需要从控制器中返回一个处理的结果&a…

execl点击单元格跳转

通过点击单元格跳转到其它单元格并获取单元格文本对数据进行过滤 平时我们通过超链接可以实现单元格跳转&#xff0c;但是并不能对数据进行过滤 此时我们可以用execl的宏来实现 实现的效果如图: 完整代码下载链接

【上海大学数字逻辑实验报告】二、组合电路(一)

一、 实验目的 熟悉TTL异或门构成逻辑电路的基本方式&#xff1b;熟悉组合电路的分析方法&#xff0c;测试组合逻辑电路的功能&#xff1b;掌握构造半加器和全加器的逻辑测试&#xff1b;学习使用可编程逻辑器件的开发工具 Quartus II设计电路。 二、 实验原理 异或门是数字…

SpringBoot+VUE3前后端分离-【支付宝支付】

1、支付宝沙箱应用申请 https://open.alipay.com/develop/sandbox/app 打开支付宝沙箱能够看到如下信息&#xff1a; 获取到appid&#xff1b; 2、获取应用私钥以及支付宝公钥 在接口加密方式选择公钥模式启用&#xff0c;根据操作即可获取应用公钥、应用私钥以及支付宝公钥…

服务运营 |精选:床位知多少?医院调度的几种建模方法(下)

编者按&#xff1a; 住院流程&#xff08;Inpatient Flow&#xff09;是一种通过协调和优化医院内部流程&#xff0c;以提高患者入院至出院期间的效率和质量的方法。住院流程通常通过医院内部信息系统和协同工作流程进行管理&#xff0c;以确保患者得到及时的诊断、治疗和护理…

Vue组件开发:工具提示组件的实现方法

在Web开发当中&#xff0c;工具提示&#xff08;Tooltip&#xff09;是一种常用的用户界面组件&#xff0c;用于向用户提供额外的信息或说明。它通常以文本形式显示在鼠标悬停或点击某个元素时&#xff0c;为用户提供更详细的内容展示。在本文中&#xff0c;我们将探讨如何使用…

异常数据检测 | Python实现基于高斯概率分布的异常检测

异常数据检测 | Python实现基于高斯概率分布的异常检测 高斯分布也称为正态分布。它可以被用来进行异常值检测,不过我们首先要假设我们的数据是正态分布的。不过这个假设不能适应于所有数据集。但如果我们做了这种假设那么它将会有一种有效的方法来发现异常值。 Scikit-Learn的…

AI PC专题:AI PC深入变革PC产业

今天分享的是AI系列深度研究报告&#xff1a;《AI PC专题&#xff1a;AI PC深入变革PC产业》。 &#xff08;报告出品方&#xff1a;西南证券研究发展中心&#xff09; 报告共计&#xff1a;30页 AI PC将深入变革PC产业  从出货量看&#xff0c;PC整体呈现周期性的特征。2…