当前位置: 首页 > article >正文

spring security 使用的过滤器还是拦截器

spring security 使用的过滤器还是拦截器

Spring Security 是一个强大的安全框架,用于保护 Java 应用程序。它主要使用过滤器(Filters)来实现安全功能,而不是拦截器(Interceptors)。不过,它也提供了一些拦截器扩展功能,可以在某些场景下与 Spring MVC 拦截器配合使用。

Spring Security 的过滤器

Spring Security 主要通过一系列的过滤器来处理安全性。这些过滤器被组织成一个过滤器链,这个链会在每个 HTTP 请求到达实际处理代码之前进行处理。常见的过滤器有:

  • SecurityContextPersistenceFilter:管理 SecurityContext 的生命周期。
  • UsernamePasswordAuthenticationFilter:处理基于表单的登录。
  • BasicAuthenticationFilter:处理 HTTP 基本认证。
  • ExceptionTranslationFilter:捕获安全异常,将其转化为符合客户端期望的响应。
  • FilterSecurityInterceptor:最终进行访问控制决策。

配置 Spring Security 过滤器链

Spring Security 的过滤器链默认通过 DelegatingFilterProxy 进行配置,通常可以在 Spring 的配置类中自定义和扩展。

XML 配置

如果你使用 XML 配置,可以通过 web.xml 配置 DelegatingFilterProxy

<filter><filter-name>springSecurityFilterChain</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping><filter-name>springSecurityFilterChain</filter-name><url-pattern>/*</url-pattern>
</filter-mapping><beans:beans xmlns="http://www.springframework.org/schema/security"xmlns:beans="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><http><!-- 配置安全规则 --></http>
</beans:beans>
Java 配置

使用 Java 配置,通过继承 WebSecurityConfigurerAdapter 并重写其方法来自定义安全配置:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public/**").permitAll().anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();}
}

Spring Security 拦截器

Spring Security 也提供了对拦截器的支持,比如方法级别的安全性(Method Security),可以通过注解来实现,如 @PreAuthorize@PostAuthorize

方法级别安全配置
启用方法级别的安全性

通过在配置类中启用方法级别的安全性:

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig {// 配置方法级别安全性
}
使用注解进行方法级别的安全控制
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;@Service
public class MyService {@PreAuthorize("hasRole('ROLE_USER')")public void userMethod() {// 只有角色为 ROLE_USER 的用户才能访问此方法}@PreAuthorize("hasRole('ROLE_ADMIN')")public void adminMethod() {// 只有角色为 ROLE_ADMIN 的用户才能访问此方法}
}

主要区别

  1. 使用场景
    • 过滤器:Spring Security 主要使用过滤器来处理整体的请求/响应安全。
    • 拦截器:拦截器主要用于更多细粒度的控制,如方法级别的安全性。
  2. 实现机制
    • 过滤器:是 Servlet 规范的一部分,负责在请求进入和响应离开 Web 容器时进行处理。过滤器在 Servlet 容器级别工作,先于所有 Spring 组件执行。拦截器在 Spring MVC 的处理流程中执行,在控制器(Controller)处理请求前后。
    • 拦截器:拦截器是基于 Spring 的 AOP(面向切面编程), 在 HandlerMappingHandlerAdapter 的工作范围内。通常是通过框架提供的机制实现,如 Spring MVC 的HandlerInterceptor。拦截器仅作用于被 Spring MVC 管理的 Controller 请求。
  3. 配置方式
    • 过滤器:通过 DelegatingFilterProxyspringSecurityFilterChain 进行配置。
    • 拦截器:通过注解 @EnableGlobalMethodSecurity 和相关安全注解进行配置。
  4. 拦截器适用场景
    • 对特定的 Controller 请求处理前后进行拦截或者封装。
    • 拦截器不具备认证、授权的过滤能力,因为它工作在处理层,而非请求链路的入口层。
    • 过滤器适合处理请求和响应的通用逻辑(如字符编码、CORS等)
    • 拦截器更适合与 Spring 框架集成的功能(如方法级别的权限验证、方法级别的日志记录等)

总结

Spring Security 主要通过过滤器链实现请求和响应的安全处理,但也提供了方法级别的安全控制支持,允许你通过拦截器和注解来进行细粒度的安全控制。过滤器用于全局的 HTTP 请求安全管理,而拦截器则用于更具体的方法级别的权限控制。

Spring Security 主要是通过过滤器链处理请求(身份认证、权限校验等核心操作),而不是使用拦截器。但在特定情况下,拦截器可以配合 Spring Security 完成一些额外的逻辑处理,比如记录审计日志、扩展特定的请求处理行为等。


过滤器 拦截器

public class PerformanceFilter implements Filter {

public class PerformanceInterceptor implements HandlerInterceptor {

过滤器(Filters)和拦截器(Interceptors)是 Java Web 开发中常用的两种机制,用于在请求到达控制器之前或响应返回客户端之前进行预处理或后处理。虽然它们都可以用于类似的目的,但在实现机制和应用场景上有所不同。

过滤器(Filters)

过滤器是 Servlet API 的一部分,主要用于对 HTTP 请求和响应进行预处理和后处理。过滤器可以拦截和修改请求和响应,但不会修改实际的控制器处理逻辑。

使用场景
  • 检查或修改请求参数
  • 进行身份验证和授权
  • 记录日志
  • 数据压缩或加密
示例代码

下面是一个简单的过滤器,它记录每个请求的处理时间:

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter(urlPatterns = "/*")
public class PerformanceFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化代码}@Overridepublic 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");}@Overridepublic void destroy() {// 销毁代码}
}
配置

可以使用 @WebFilter 注解或在 web.xml 文件中配置过滤器。上面的例子使用的是 @WebFilter 注解。

拦截器(Interceptors)

拦截器通常是框架(如 Spring MVC)提供的机制,不是 Servlet API 的一部分。它用于在控制器方法调用之前和之后进行处理。拦截器比过滤器更强大,可以访问更多的信息,如控制器方法参数,返回值等。

使用场景
  • 用户认证和授权
  • 日志记录和分析
  • 统一异常处理
  • 数据格式转换
示例代码

以下是一个简单的 Spring MVC 拦截器,用于记录每个请求的处理时间:

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class PerformanceInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {request.setAttribute("startTime", System.currentTimeMillis());return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {long startTime = (Long) request.getAttribute("startTime");long endTime = System.currentTimeMillis();System.out.println("Request processed in " + (endTime - startTime) + " ms");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {// 完成处理}
}
配置

在 Spring MVC 中,你需要将拦截器注册到 WebMvcConfigurer

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 WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new PerformanceInterceptor()).addPathPatterns("/**");}
}

主要区别

  1. 实现机制

    • 过滤器是 Servlet API 的一部分,可以应用于所有的 Servlet 请求。
    • 拦截器通常是框架(如 Spring MVC)提供的功能,主要用于控制器方法的调用。
  2. 使用范围

    • 过滤器可以应用于整个应用程序,无论是静态资源还是动态请求。
    • 拦截器通常只处理控制器方法的请求。
  3. 访问权限

    • 过滤器只能访问请求和响应对象,无法访问控制器方法的参数和返回值。
    • 拦截器可以访问控制器方法的参数和返回值,具有更高的灵活性。
  4. 配置方式

    • 过滤器可以在 web.xml 文件中配置,也可以使用注解。
    • 拦截器需要在框架配置文件中注册或使用代码进行配置。

总结

过滤器和拦截器都是预处理和后处理请求的有效机制,各有优缺点和适用的场景。在选择使用哪种机制时,可以根据需要处理的内容和应用程序的具体需求来选择。通常,过滤器适用于全局请求处理,而拦截器更适用于控制器级别的请求处理。

相关文章:

spring security 使用的过滤器还是拦截器

spring security 使用的过滤器还是拦截器 Spring Security 是一个强大的安全框架&#xff0c;用于保护 Java 应用程序。它主要使用过滤器&#xff08;Filters&#xff09;来实现安全功能&#xff0c;而不是拦截器&#xff08;Interceptors&#xff09;。不过&#xff0c;它也提…...

大疆上云api介绍

概述 目前对于 DJI 无人机接入第三方云平台,主要是基于 MSDK 开发定制 App,然后自己定义私有上云通信协议连接到云平台中。这样对于核心业务是开发云平台,无人机只是其中一个接入硬件设备的开发者来说,重新基于 MSDK 开发 App 工作量大、成本高,同时还需要花很多精力在无人…...

2025-03-25 Unity 网络基础4——TCP同步通信

文章目录 1 Socket1.1 Socket 类型1.2 构造 Socket1.3 常用属性1.4 常用方法 2 TCP 通信2.1 服务端配置2.2 客户端配置2.3 进行通信2.4 多设备通信 3 区分消息 1 Socket ​ Socket 是 C# 提供的网络通信类&#xff08;其它语言也有对应的 Socket 类&#xff09;&#xff0c;是…...

C++进阶(一)

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 前言 本篇博客是讲解函数的重载以及引用的知识点的。 文章目录 前言 1.函数重载 1.1何为函数重载 1.2函数重载的作用 1.3函数重载的实现 2.引用 2.1何为引用 2.2定义引用 2.3引用特性 2.4常引用 2…...

深度解读DeepSeek:开源周(Open Source Week)技术解读

深度解读DeepSeek&#xff1a;开源周&#xff08;Open Source Week&#xff09;技术解读 深度解读DeepSeek&#xff1a;源码解读 DeepSeek-V3 深度解读DeepSeek&#xff1a;技术原理 深度解读DeepSeek&#xff1a;发展历程 文章目录 一、开源内容概览Day1&#xff1a;FlashMLAD…...

AI Agent开发与应用

AI Agent开发与应用&#xff1a;本地化智能体实践——本地化智能体开发进展与主流框架分析 我要说的都在ppt里面了&#xff0c;相关复现工作请参考ai agent开发实例 OpenManus Dify Owl 第二个版本更新了对话的框架&#xff0c;通过gradio做了一个全新的界面 只测试了阿里云…...

石斛基因组-文献精读122

A chromosome-level Dendrobium moniliforme genome assembly reveals the regulatory mechanisms of flavonoid and carotenoid biosynthesis pathways 《染色体水平的石斛基因组组装揭示了黄酮类和胡萝卜素生物合成途径的调控机制》 摘要 石斛&#xff08;Dendrobium monil…...

javaSE.多维数组

1 final 引用类型 final int[] arr 继承Object 的引用类型&#xff0c;不能改变引用的对象 存的其实是引用 数组类型数组&#xff0c;其实存的是引用 int [][] arr new int[][] { {1,2,3}, {4,5,6} };int [] a arr[0]; int [] b arr[1];...

Spring IOC容器详解:深入理解控制反转与依赖注入

一、什么是IOC&#xff1f; 在java当中一个类想要使用另一个类的方法&#xff0c;就必须在这个类当中创建这个类的对象&#xff0c;那么可能会出现如下情况&#xff0c; 比如A类当中创建着B对象&#xff0c;B类当中有C对象&#xff0c;C类当中有A对象&#xff0c;这个如果一个类…...

Python条件处理,新手入门到精通

Python条件处理&#xff0c;新手入门到精通 对话实录 **小白**&#xff1a;&#xff08;崩溃&#xff09;我写了if x 1:&#xff0c;为什么Python会报错&#xff1f; **专家**&#xff1a;&#xff08;推眼镜&#xff09;**是赋值&#xff0c;才是比较**&#xff01;想判断相…...

JPA实体类注解缺失异常全解:从报错到防御!!!

&#x1f6a8; JPA实体类注解缺失异常全解&#xff1a;从报错到防御 &#x1f6e1;️ 一、&#x1f4a5; 问题现象速览 // 经典报错示例 Caused by: java.lang.IllegalArgumentException: Not a managed type: class com.example.entity.Product典型症状&#xff1a; &…...

Spring 源码硬核解析系列专题(三十二):Spring Cloud LoadBalancer 的负载均衡源码解析

在前几期中,我们从 Spring 核心到 Spring Boot 的多个模块,再到 Spring Cloud Alibaba,逐步揭示了 Spring 生态在微服务领域的广泛应用。Spring Cloud LoadBalancer 是 Spring Cloud 提供的客户端负载均衡组件,替代 Ribbon,支持服务发现和负载均衡策略。本篇将深入 Spring…...

生成式媒介革命已至,搜索如何借力DeepSeek破局?

作为前沿AI技术的代表&#xff0c;DeepSeek不仅突破了传统大模型的算力瓶颈&#xff0c;更以“高性能低成本开源生态”的特性&#xff0c;重塑传播生态。对于搜索行业从业者而言&#xff0c;这场技术变革既是机遇&#xff0c;也是挑战。 DeepSeek的三大“杀手锏”&#xff0c;…...

【Vue3入门1】02- Vue3的基本操作(上)

本文介绍vue3中的一些方法的操作。 目录 1. 绑定事件 v-on 2. 按键修饰符 3. 显示和隐藏 v-show 4. 条件渲染 v-if 5. 条件渲染if-else 1. 绑定事件 v-on 点击事件 v-on:click" 发生事件 " <body><div id"app">{{ msg }} <h2&g…...

【C语言】多进程/多线程

【C语言】多进程/多线程 参考链接多进程/多线程服务器1. 多进程服务器2. 多线程服务器 结语参考链接 参考链接 c 中文网 菜鸟 c 多进程/多线程服务器 多进程和多线程是常用的并发编程技术。它们都允许程序同时执行多个任务&#xff0c;提高了系统的资源利用率和程序的运行效率…...

模糊数学 | 模型 / 集合 / 关系 / 矩阵

注&#xff1a;本文为来自 “模糊数学 | 模型及其应用” 相关文章合辑。 略作重排。 如有内容异常&#xff0c;请看原文。 模糊数学模型&#xff1a;隶属函数、模糊集合的表示方法、模糊关系、模糊矩阵 wamg 潇潇 于 2019-05-06 22:35:21 发布 1.1 模糊数学简介 1965 年&a…...

Browserlist 使用指南:应对浏览器兼容性问题的解决方案

前言 在前端开发中&#xff0c;我们经常需要处理各种不同的浏览器兼容性问题。每个浏览器的版本众多&#xff0c;处理这些问题可能会让人感到头疼。幸运的是&#xff0c;有一个名为 Browserlist 的工具可以大大简化这项工作。本文将介绍 Browserlist 的作用和使用方法&#xf…...

QinQ项展 VLAN 空间

随着以太网技术在网络中的大量部署&#xff0c;利用 VLAN 对用户进行隔离和标识受到很大限制。因为 IEEE802.1Q 中定义的 VLAN Tag 域只有 12 个比特&#xff0c;仅能表示 4096 个 VLAN&#xff0c;无法满足城域以太网中标识大量用户的需求&#xff0c;于是 QinQ 技术应运而生。…...

数据结构—树(java实现)

目录 一、树的基本概念1.树的术语2.常见的树结构 二、节点的定义三、有关树结构的操作1.按照数组构造平衡 二叉搜索树2.层序遍历树3.前、中、后序遍历树(1).前序遍历树(2).中序遍历树(3).后序遍历树(4).各种遍历的情况的效果对比 4.元素添加5.元素删除1.删除叶子节点2.删除单一…...

Unity射击游戏手榴弹笔记

数据 在物品系统增加一个新的物品类&#xff0c;手榴弹类&#xff0c;定义手榴弹依附物体的类、配表数据类、背包内物品数据类、新建配表、在背包增加手榴弹数组&#xff1b;手榴弹的预制体需要可拾取的、扔出的&#xff1b;背包界面增加背包内的手榴弹、场景里的手榴弹、别人…...

S32K144外设实验(七):FTM输出多路互补带死区PWM

文章目录 1. 概述1.1 时钟系统1.2 实验目的2. 代码的配置2.1 时钟配置2.2 FTM模块配置2.3 输出引脚配置2.4 API函数调用1. 概述 互补对的PWM输出是很重要的外设功能,尤其应用再无刷电机的控制。 1.1 时钟系统 笔者再墨迹一遍时钟的设置,因为很重要。 FTM的CPU接口时钟为SY…...

SingleMod

SingleMod SingleMod是一种深度学习模型,专为利用纳米孔直接RNA测序(DRS)数据在单RNA分子中精确检测m6A修饰而设计。该模型通过深度多实例回归框架进行训练,能够充分利用广泛的甲基化率标签。SingleMod是一个通用框架,可轻松适配其他核酸修饰的检测模型训练。 注意: Si…...

[网鼎杯 2020 白虎组]PicDown1 [反弹shell] [敏感文件路径] [文件描述符]

常见读取路径 /etc/passwd一些用户和权限还有一些乱七八糟的 /proc/self/cmdline包含用于开始当前进程的命令 /proc/self/cwd/app.py当前工作目录的app.py /proc/self/environ包含了可用进程的环境变量 /proc/pid/exe 包含了正在进程中运行的程序链接&#xff1b; /proc/pid…...

单纯形法之大M法

1. 问题背景与标准化 在求解某些线性规划问题时&#xff0c;往往难以直接找到初始的基本可行解。特别是当约束中存在等式或 “≥” 类型的不等式时&#xff0c;我们需要引入人工变量来构造一个初始可行解。 考虑如下标准形式问题&#xff08;假设为最大化问题&#xff09;&am…...

各类神经网络学习:(四)RNN 循环神经网络(下集),pytorch 版的 RNN 代码编写

上一篇下一篇RNN&#xff08;中集&#xff09;待编写 代码详解 pytorch 官网主要有两个可调用的模块&#xff0c;分别是 nn.RNNCell 和 nn.RNN &#xff0c;下面会进行详细讲解。 RNN 的同步多对多、多对一、一对多等等结构都是由这两个模块实现的&#xff0c;只需要将对输入…...

DeepSeek 发布DeepSeek-V3-0324 版本 前端与网页开发能力、推理与多任务能力提升

DeepSeek 发布 DeepSeek-V3-0324 版本 DeepSeek 发布 DeepSeek-V3-0324 版本&#xff0c;在其前代模型 DeepSeek-V3 的基础上进行了显著升级。 该模型专注于中文和多语言文本生成、推理、代码编写等综合能力的提升&#xff0c;支持 Function Calling&#xff08;函数调用&…...

航班时间 | 第九届蓝桥杯省赛C++A组

小 h 前往美国参加了蓝桥杯国际赛。 小 h 的女朋友发现小 h 上午十点出发&#xff0c;上午十二点到达美国&#xff0c;于是感叹到“现在飞机飞得真快&#xff0c;两小时就能到美国了”。 小 hh 对超音速飞行感到十分恐惧。 仔细观察后发现飞机的起降时间都是当地时间。 由于…...

传输层安全协议 SSL/TLS 详细介绍

传输层安全性协议TLS及其前身安全套接层SSL是一种安全传输协议&#xff0c;目前TLS协议已成为互联网上保密通信的工业标准&#xff0c;在浏览器、邮箱、即时通信、VoIP等应用程序中得到广泛的应用。本文对SSL和TLS协议进行一个详细的介绍&#xff0c;以便于大家更直观的理解和认…...

编程实现自我指涉(self-reference)

从计算机的组成原理出发&#xff0c;编程实现自我指涉&#xff08;self-reference&#xff09;本质上是通过代码操纵代码&#xff0c;形成逻辑上的闭环。这种能力不仅是编程语言设计中的一个奇妙现象&#xff0c;更是计算理论、计算机架构、乃至哲学层面的一种深刻映射。让我们…...

CentOS8 安装 Docker-CE

如果之前安装过docker,请先卸载旧版本: yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 安装所需的软件包: yum install -y yum-utils 添加软件源信息(设置存储库)…...