过滤器(Filter)与拦截器(Interceptor)
创作时间:
作者:
@小白创作中心
过滤器(Filter)与拦截器(Interceptor)
引用
CSDN
1.
https://blog.csdn.net/F190323X/article/details/137726259
过滤器 Filter
过滤器是JavaWeb三大组件(Servlet、Filter、Listener)之一。其主要作用是把客户端对服务端资源的请求拦截下来,从而实现一些特殊的功能。常见的应用场景包括登录校验、统一编码处理等。
过滤器实现过程
- 定义一个类去实现
Filter接口,根据自身需求实现里面的方法(通常只需要重写doFilter方法即可)。 - 在实现类的类名上方添加注解
@WebFilter(urlPatterns = "/*"),urlPatterns代表的是需要拦截的资源请求路径(此时是对所有的资源请求路径均拦截)。 - 完成以上两步之后还需在启动类上方加上注解
@ServletComponentScan来开启对servlet组件的支持。
过滤器执行流程
请求 --> 放行前逻辑 --> 放行 --> 目标资源 --> 放行后逻辑
过滤器链
当一个web应用中,配置多个过滤器时,就会形成一个过滤器链,过滤器链的执行流程是按照过滤器名的升序来执行的(a---z || A-Z),当正在执行的过滤器放行时,会进入下一个过滤器继续执行,当达到最后一个过滤器时,才会去访问目标资源,随后再倒着回去(类似函数的递归调用)。
拦截器 Interceptor
Interceptor是一种特殊的组件,可以在请求处理的过程中对资源的请求和响应进行拦截和处理。可以在资源请求到达目标处理器之前、处理器处理请求之后以及视图渲染之前执行特定的操作。
拦截器实现过程
第一、定义拦截器
定义一个类去实现HandlerInterceptor接口,重写接口中的所有方法。
- 方法一:
boolean preHandle()。执行时机:在目标资源方法执行前执行,返回true:放行,返回false:不放行。 - 方法二:
void postHandle()。执行时机:在目标资源方法执行后执行。 - 方法三:
void afterCompletion()。执行时机:在视图渲染完毕后执行,最后执行。
代码示例
package com.fhh.interceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
第二、注册拦截器(配置)
- 定义一个类去实现
WebMvcConfigurer接口,重写其中的addInterceptors(InterceptorRegistry registry)方法。 - 在方法中指定我们定义好的拦截器与拦截路径。
- 通过
registry中的addInterceptor()方法来指定拦截器。 - 通过
addPathPatterns()方法来指定资源拦截路径。 - 通过
excludePathPatterns()方法指定在资源拦截路径中不需要拦截的资源请求路径。
指定资源拦截路径时有以下选择
代码示例
package com.fhh.config;
import com.fhh.interceptor.LoginCheckInterceptor;
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 WebConfig implements WebMvcConfigurer {
// 注入LoginCheckInterceptor对象
@Autowired
private LoginCheckInterceptor loginCheckInterceptor;
// 进行注册
@Override
public void addInterceptors(InterceptorRegistry registry) {
// addInterceptor:需要注册的拦截器
// addPathPatterns:需要拦截哪些资源(只对于Controller层)
// excludePathPatterns:不需要拦截哪些资源
registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
}
}
拦截器的执行流程
过滤器与拦截器的区别
- 接口规范:过滤器需要实现
Filter接口,而拦截器需要实现HandlerInterceptor接口。 - 执行时机:过滤器在拦截器之前执行,拦截器在处理器之前执行。
- 拦截范围:过滤器
Filter会拦截所有的资源,而Interceptor只会拦截Spring环境中的资源。 - 拦截对象:filter拦截对象为service服务层,而interceptor拦截对象为Controller数据访问层。
- 使用场景:过滤器主要用于对请求和响应的全局处理,而拦截器主要用于对特定请求的处理。
热门推荐
带娃去西双版纳,昆虫和大象谁更吸睛?
脱发增多可能是身体在报警!这四种疾病要当心
16岁男孩每天只睡5小时致头秃,医生解析熬夜与脱发的关系
双十一期间货拉拉司机收入调查:高收入背后的压力与矛盾
货拉拉司机如何应对职业新挑战?
2025春运大潮中,年轻人的归乡抉择
《不差钱》背后的故事:赵本山如何找到灵感?
睡前采取哪些保暖措施,才能真正安享温暖睡眠?
中药治失眠:7种药材助你一夜好眠
文艺上海年|逛古镇、赏灯会,在上海体验浓郁的民俗非遗年味
元旦春节将至,这些长三角特色温泉,助你开启冬日温暖之旅!
家庭环境与儿童心理健康:从理解到实践
比特币暴跌背后:区块链技术的未来在哪里?
CBOE推出比特币指数期权,中国投资者如何应对?
23类常见食材的储存保鲜指南,通俗易懂,实用详尽,收藏慢慢看
烹饪专业都学什么课程
高甘油三酯不容忽视 这些危害需警惕
甘油三酯高与脂肪肝的关系及改善方法
比特币诈骗频发!如何保护你的数字资产?
虚拟货币诈骗案揭秘:430亿比特币洗钱案背后的警示
警惕!这些虚拟货币骗局你一定要知道
墨鱼田七丹参汤能缓解肋间神经痛吗?
AI助力医疗创新:从疼痛管理到肋间神经痛治疗的未来展望
刮痧治疗肋间神经痛:传统疗法的现代应用
北京大学第一医院推荐:预防肋间神经痛小妙招
货拉拉司机收入困境:从维权事件看平台经济下的生计挑战
双十一期间货拉拉司机如何赚翻?
重磅|癌症早期风险筛查“1+X”实施方案正式发布
手术治疗痔疮价格:详细解析影响因素和医保报销情况
冰箱也能变“神器”!肉皮冻保存新招