Java中的过滤器和拦截器

news2025/1/18 9:43:04

Java中的过滤器和拦截器

一.应用场景

拦截器应用场景

拦截器本质上是面向切面编程(AOP),符合横切关注点的功能都可以放在拦截器中来实现,主要的应用场景包括:

  1. 登录验证,判断用户是否登录。
  2. 权限验证,判断用户是否有权限访问资源,如校验token
  3. 日志记录,记录请求操作日志(用户ip,访问时间等),以便统计请求访问量。
  4. 处理cookie、本地化、国际化、主题等。
  5. 性能监控,监控请求处理时长等。
  6. 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现)

过滤器应用场景

  1. 过滤敏感词汇(防止sql注入)
  2. 设置字符编码
  3. URL级别的权限访问控制
  4. 压缩响应信息

二.执行顺序

在这里插入图片描述
在这里插入图片描述

三.异同点

  1. 提供者
    截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。过滤器是JavaEE标准,只需依赖servlet api ,不需要依赖spring。过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境

  2. 触发时机
    过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。

  3. 实现方式
    过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射。拦截器可以调用IOC容器中的各种依赖,而过滤器不能。

  4. 依赖
    Filter是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。

  5. 执行方式
    Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理(反射)的方式来执行。过滤器可以修改request,而拦截器不能。过滤器只能在请求的前后使用,而拦截器可以详细到每个方法

  6. 生命周期
    Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。

总的来说

过滤器就是筛选出你要的东西,比如requeset中你要的那部分。拦截器在做安全方面用的比较多,比如终止一些流程

四.实现方法

过滤器

两种方式实现

  1. 使用spring boot提供的FilterRegistrationBean注册Filter
  2. 使用原生servlet注解定义Filter
package com.yfapi.api;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * 自定义过滤器
 */
@WebFilter({"/*"})
public class MyTokenAuthFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("do my filter");
        chain.doFilter(request,response);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

在application上添加自定义扫描器注解 @ServletComponentScan 或者 自己实现FilterRegistrationBean配置类

拦截器

自定义类实现接口HandlerInterceptor,重写preHandle方法。

package com.yfapi.api;

import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 自定义拦截器
 */
public class MyTokenAuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行拦截器");
        
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }
}

自定义拦截器注册类

package com.yfapi.api;

import com.google.common.collect.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 自定义拦截器注册类
 */
@Configuration
public class MyTokenAuthInterceptorConfigurer implements WebMvcConfigurer {
    @Autowired
    private  MyTokenAuthInterceptor myTokenAuthInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        /**
         * 注册拦截器,除了common和authenticate接口其他的都要拦截判断token
         */
        String[] excludePath = {
                "/api/authenticate/**",
                "/api/common/**"
        };
        registry.addInterceptor(myTokenAuthInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns(Lists.newArrayList(excludePath));
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

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

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

相关文章

JSP的分页

分页在读取数据库里的数据需要用,在以后数据库肯定还会有很多数据,一个页面装不下,所以需要分页功能。数据库查询的分页语句是“SELECT * FROM emp LIMIT 0, 5;”这里0是指起始行,5是查询5行,第二页起始行就是5&#x…

QT 实现右键菜单

有时我们希望在窗口中右键弹出菜单,这里来介绍一下QT中怎么实现. .h 中添加事件相应函数声明和变量定义: private:// 菜单事件void contextMenuEvent(QContextMenuEvent* event) override;void initMenu();private:QMenu* m_pMenu nullptr;在构造函数中…

聊聊如何避免多个jar通过maven打包成一个jar,多个同名配置文件发生覆盖问题

前言 不知道大家在开发的过程中,有没有遇到这种场景,外部的项目想访问内部nexus私仓的jar,因为私仓不对外开放,导致外部的项目没法下载到私仓的jar,导致项目因缺少jar而无法运行。 通常遇到这种场景,常用…

HUN工训中心:开关电路和按键信号抖动

工训中心的牛马实验 1.实验目的: 1) 认识开关电路,掌握按键状态判别、开关电路中逻辑电平测量、逻辑值和逻辑函数电路。 2) 掌握按键信号抖动简单处理方法。 3) 实现按键计数电路。 2.实验资源: HBE硬件基础电路实验箱、示波器、万用表…

Java学习--网络编程

1. 网络编程入门 1.1 网络编程概述 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统…

【GIT】git不同仓库设置不同用户名和邮箱

随着业务的拓展,工作中,我们除了要在公司的git库提交代码,还可能在阿里云效codeup、gitcode等上提交代码。 之前git安装时使用的是全局名称,导致所有的git提交都使用了相同的用户名和邮箱。 查看全局用户名和邮箱 $ git config -…

论文调研——23.2.28

文章目录Diffusion Models: A Comprehensive Survey of Methods and ApplicationsADVERSARIAL TRAINING METHODS FOR SEMI-SUPERVISED TEXT CLASSIFICATIONHuman Emotion Knowledge Representation Emerges in LargeAPI 调优上: Decoder Tuning: Efficient Language…

记录一下atlas200模块无法正常通过别的设备SSH连接192.168.1.2问题笔记粗心者用

atlas200远程登录发现登录不了 串口打印内核信息正常显示,如下几个错误记录分别在windows上和ubuntu上分别做了测试,之前都是 安装完 kex_exchange_identification: read: Connection reset 华为atlas200模块 登录显示这个目前没有解决,应该…

220V转5V非隔离2W电源--超低成本

目录 详情 产品特性和优势 设计电路 MP150芯片资料 详情 MP150 是一款原边调节器,可以在无光耦合器的条件下提供精确的恒压(CV)调节。MP150 支持降压、升降压、升压和反激拓扑。它内部集成了 500V MOSFET,可简化结构&#xff0…

HUN工训中心:三位数码管扫描显示实验报告

工训中心牛马实验 1.1操作说明及现象描述 根据老师发的安装包下载和安装好Quartus II软件。在电脑安装USB硬件驱动,再与PC接口连接好,可以打开任务管理器查看是否安装好。之后打开Quartus II软件,按照菜单Tool->programmer->add file…

6大类,不同类型单板布线策略

PCB布线策略 一、类型一主要特征如下 严格的长度规则、严格的串扰规则、拓扑规则、差分规则、电源地规则等。 二、关键网络的处理:总线定义Class 要求满足一定的拓扑结构、stub及其长度(时域)约束条件 图-1 平衡菊花链和中间驱动菊花链图 设置虚拟管脚来控制拓扑…

张驰咨询:六西格玛常见问题解答

以下是张驰咨询对一些关于六西格玛常见问题的解答: 1、六西格玛是什么? 六西格玛是一种改善企业质量流程管理的技术,以“零缺陷”的完美商业追求,带动质量大幅提高、成本大幅度降低,最终实现企业财务成效的提升与企业…

SpringCloud系列知识快速复习 -- part 1(SpringCloud基础知识,Docker,RabbitMQ)

SpringCloud知识快速复习SpringCloud基础知识微服务特点SpringCloud常用组件服务拆分和提供者与消费者概念Eureka注册中心原理Ribbon负载均衡原理负载均衡策略饥饿加载Nacos注册中心服务分级存储模型权重配置环境隔离Nacos与Eureka的区别Nacos配置管理拉取配置流程配置热更新配…

大家挤破脑袋都想进的腾讯,你为什么想要辞职?

前几天,我在网上看到一个故事。 故事的主人翁是19届的校招生,目前入职腾讯,工作了一个月。这一个月给他的感受是大量的写测试用例,感觉自己写测试用例的能力熟练了不少,测试技能倒是没有多大的提高,真正需…

一文解决Python所有报错

前言 Python是一种强大的编程语言,但是它也有一些报错,这些报错可能会让你感到困惑。本文将介绍如何解决Python中的常见报错。 首先,让我们来看看Python中最常见的报错:SyntaxError。这种报错表明你的代码中有语法错误&#xff0c…

Javaweb增删改查之【查】

Javaweb增删改查之【查】1.前端页面2.java链接数据库——集成mybatis2.1 建立层2.2 实体层entity2.3 mapper(dao层)2.4 mybatis配置文件2.5工具层util3.后台功能3.1servlet前几天跟着b站up主学javaweb登录,突然还是觉得这几年学了c是真的挺好…

对象扩展、函数的扩展、Symbol、Iterator 迭代器、Set结构、Map 数据结构——ES6+

目录 一、对象扩展 二、函数的扩展 三、Symbol 四、Iterator 迭代器 五、Set结构 六、Map 数据结构 一、对象扩展 1. 对象简写 对于对象属性,属性名与属性值对应的变量相同时,可简写为属性名 对于对象方法,将 :function…

优化基于axios接口管理的骚操作

优化基于axios接口管理的骚操作! 本文针对中大型的后台项目的接口模块优化,在不影响项目正常运行的前提下,增量更新。 强化功能 1.接口文件写法简化(接口模块半自动化生成) 2.任务调度、Loading调度(接口层…

Javaweb复习之HTTPTomcatServelet

1.Web概述 1.1 Web和JavaWeb的概念 Web是全球广域网,也称为万维网(www),能够通过浏览器访问的网站。 JavaWeb就是用Java技术来解决相关web互联网领域的技术栈 1.2 JavaWeb技术栈 B/S 架构:Browser/Server,浏览器/服务器 架构模…

仓库管理系统包括哪些方面?

想要弄清楚仓库管理系统包括哪些方面,得先了解仓库管理体系包含哪些方面。 一般来说,仓库管理体系包含以下四大方面: 数据精确度体系:如何通过制定相关政策及操作规范,提升库内数据的准确度。管理体系:构…