SpringMVC中的过滤器和拦截器

本文详细介绍了SpringMVC中过滤器和拦截器的概念与区别。过滤器依赖于容器,用于请求和响应的预处理及后处理,而拦截器则基于AOP思想,能访问容器资源,常用于业务逻辑处理。文章还涵盖了过滤器和拦截器的实现步骤及执行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringMVC中的过滤器和拦截器

一、过滤器

​ 过滤器Filter是通过实现java.servlet.filter接口实现过滤器功能,作用是用于对传入的request和响应的response进行一些处理,比如对请求参数进行校验,或者设置、检验头部信息,再或者对一些非法行为进行校验。由实现的接口可知,过滤器是依赖于servlet容器。所以由于过滤器不依赖于spring容器,它也就无法获取到容器中的对象。

创建一个过滤器类继承java.servlet.filter接口,实现filter中的拦截方法。

package com.example.demo.modules.filter;

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

/**
 * @Description:
 * @date :  2020/6/9
 */
public class MyFilter implements Filter {
   

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
   

	}

	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
   
		// 过滤器的具体执行方法
	}

	@Override
	public void destroy() {
   

	}
}
  1. 把创建的过滤器类加入过滤器链中
package com.example.demo.modules.filter;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework
### Spring MVC 过滤器拦截器的区别 #### 定义与作用范围 过滤器Filter拦截器(Interceptor)都用于对HTTP请求进行预处理或后处理,但二者的作用域不同。过滤器更倾向于处理那些与业务逻辑无关的操作,如字符编码转换、日志记录等[^5];而拦截器主要针对控制器层的请求,能够获取更多的上下文信息并支持依赖注入,适用于需要访问业务对象的情况[^3]。 #### 实现方式 - **过滤器**:基于Servlet规范定义,通过配置`web.xml`或者使用注解的方式注册到应用中。它独立于任何特定框架之外工作,因此不具备Spring容器管理下的特性。 - **拦截器**:作为Spring MVC的一部分被设计出来,利用了Spring AOP的思想来增强Controller的功能。可以通过实现HandlerInterceptor接口来自定义行为,并且能方便地享受到IoC/DI带来的便利[^1]。 #### 执行顺序与时序图 对于一次完整的Web请求来说: 1. 请求先经过一系列已配置好的Filters; 2. 接着进入DispatcherServlet分发给对应的HandlerMapping找到目标处理器; 3. 在真正调用Controller之前会依次触发PreHandle()方法所在的Interceptors链; 4. Controller完成视图渲染返回ModelAndView之后再逆向执行PostHandle(); 5. 整个流程结束后还会有一个AfterCompletion阶段用来做最后清理工作。 ```mermaid sequenceDiagram participant Client as 浏览器客户端 participant FilterChain as 过滤器链条 participant DispatcherServlet as 前端控制器 participant HandlerMapping as 处理器映射器 participant InterceptorChain as 拦截器链条 participant Controller as 控制器 Client->>FilterChain: HTTP Request FilterChain->>DispatcherServlet: doFilter() DispatcherServlet->>HandlerMapping: getHandler() HandlerMapping->>InterceptorChain: preHandle() InterceptorChain->>Controller: invoke() Controller-->>InterceptorChain: modelAndView InterceptorChain-->>DispatcherServlet: postHandle() DispatcherServlet-->>Client: Response ``` #### 使用案例分析 假设现在要开发一个简单的博客系统,其中涉及到用户认证授权等功能,则可以考虑如下安排: - 对所有页面启用统一的日志记录功能——这显然更适合交给过滤器去做,因为它不需要知道太多关于内部路由的信息就能很好地完成任务。 - 当某个未登录状态下的访客试图查看受保护的文章详情页时,应该跳转至登陆界面而不是直接展示错误提示——此时就可以借助拦截器捕获该类异常情况并作出适当反应。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值