【Spring 深入学习】过滤器详解
创始人
2024-06-02 17:51:49
0

过滤器详解

1. 概述

今天会详细的讲述下过滤器,过滤器在我们业务开发中占有非常重要地位,比如:
Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能 处理编码

2. 所处位置

那么一般都是什么时候开始执行过滤器的呢,看下图:

在这里插入图片描述

通过上图我们可以得知,其实是在请求到达servlet之前开始执行的。

接下来我们简单看下 过滤器使用过程

  • HttpServletRequest到达 Servlet 之前,拦截客户的HttpServletRequest 。根据需要检查HttpServletRequest,也可以修改HttpServletRequest 头和数据

  • HttpServletResponse到达客户端之前,拦截HttpServletResponse 。根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据

  • Filter接口中有一个doFilter方法,当开发人员编写好Filter,并配置对哪个web资源进行拦截后,Web服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,doFilter方法中有一个filterChain对象,用于继续传递给下一个filter,在传递之前我们可以定义过滤请求的功能,在传递之后,我们可以定义过滤响应的功能

各位看众,不知道是否在Node使用过Koa。这个拦截器链跟整个Koa的思想保持一致。方法filterChain 可以理解为next方法。
设置response的响应值的方法可以理解为ctx.body
都是一种链式调用的思想

3. 生命周期

  • 构造方法

实例化一个Filter对象的方法. 初期的时候执行,执行一次

  • 初始化方法

和我们编写的Servlet程序一样,Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象

  • 拦截请求方法

这个方法完成实际的过滤操作。当客户请求访问与过滤器关联的URL的时候,Servlet过滤器将先执行doFilter方法。FilterChain参数用于访问后续过滤器

  • 销毁方法

Filter对象创建后会驻留在内存,当web应用移除或服务器停止时才销毁。在Web容器卸载 Filter 对象之前被调用。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源

4. 配置过滤器

4.1 通过配置文件配置

定义拦截规则

@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean registrationBean() {FilterRegistrationBean myFilterFilterRegistrationBean = new FilterRegistrationBean<>(new MyFilter());myFilterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));return myFilterFilterRegistrationBean;}
}

自定义Filter

public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("MyFilter 执行之前");filterChain.doFilter(servletRequest, servletResponse);System.out.println("MyFilter 执行之后");}
}

执行结果

在这里插入图片描述

4.2 通过注解配置

配置 Filter 扫描

@SpringBootApplication
@ServletComponentScan(basePackages = "plus.chendd.filter")
public class SpringBootFilterDemo02Application {public static void main(String[] args) {SpringApplication.run(SpringBootFilterDemo02Application.class, args);}
}

通过注解ServletComponentScan 来配置Filter扫描

自定义 Filter

@WebFilter(urlPatterns = {"/*"})
public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("MyFilter 执行之前");filterChain.doFilter(servletRequest, servletResponse);System.out.println("MyFilter 执行之后");}
}

关于注解WebFilter 有哪些属性,可以参照下图:

在这里插入图片描述

执行结果

在这里插入图片描述

5. 综合案例

需求:
对所有的请求进行拦截,判断header 或是 cookie是否存在某一个特定属性,并且判断属性值是否符合规范。如果两者都满足说明是我们特定的请求,反之都是无效的请求

配置Filter 过滤规则

@Configuration
public class FilterSetupConfig {@Beanpublic FilterRegistrationBean invalidPathFilter() {FilterRegistrationBean filterFilterRegistrationBean = new FilterRegistrationBean<>(new AInvalidPath());// 添加过滤路径filterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));return filterFilterRegistrationBean;}
}

定义Filter 来匹配内容

public class AInvalidPath implements Filter {/*** 共同的相应处理** @param rep*/public void commonRepHandle(HttpServletResponse rep) throws IOException {rep.setStatus(200);rep.setContentType("application/json; charset=utf-8");rep.getWriter().print(new JSONObject(R.fail(Utils.INVALID_PATH).put("msg", "无效的请求")));}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) servletRequest;HttpServletResponse rep = (HttpServletResponse) servletResponse;// 依次获取header 以及cookie的值  以header的优先String certificate = null;if (req.getHeader("certificate") != null) certificate = req.getHeader("certificate");if (StringUtils.isBlank(certificate)) certificate = Utils.getCookieByName(req, "certificate");if (StringUtils.isBlank(certificate)) {this.commonRepHandle(rep);return;}// 判断验证规范if (certificate.length() != 13) {this.commonRepHandle(rep);return;}String date = Utils.currDateYmd().replaceAll("-", "").substring(0, 6);if (certificate.indexOf("-") == -1 || !date.equals(certificate.substring(0, 6))) {this.commonRepHandle(rep);return;}filterChain.doFilter(servletRequest, servletResponse);}
}

6. 结论

Filter 过滤器的重要性 不言而喻,多多练习哦。 可以参照如下Demo 源码:配置文件版本, 注解版本

相关内容

热门资讯

马来西亚18岁中国留学生绑架案... 5月13日,两名中国留学生在马来西亚伪造绑架,骗取父母500万元赎金,被警方逮捕。5月14日,曾协助...
健康证不“健康” 不是小事 转自:劳动午报 我们日常生活中接触到的厨师、外卖配送员、护工、月嫂等从业人员,每年都至少要进行一次相...
市总工会公益普法活动走进市公园... 转自:劳动午报 本报讯(记者 余翠平)2025年5月是第五个“民法典宣传月”,为落实北京市总工会“八...
普京:准备欢迎西方公司回归 据俄罗斯媒体13日报道,俄罗斯总统普京当天表示,只要符合俄罗斯的经济利益,俄罗斯准备欢迎在俄乌冲突升...
山东“救人缺考”学生将全力准备... 转自:千龙网5月14日下午,山东省教育招生考试院发布公告称,经报请上级主管部门同意,将按程序启用春季...
我市实施排水管网建设改造攻坚行... 5月14日,在第34个全国城市节水宣传周到来之际,市住建委发布消息,今年我市大力实施排水管网建设改造...
黄金突然跳水!跌破3180美元 黄金突然再跳水!5月14日晚,现货黄金跌势不止,向下跌破3180美元/盎司,创4月15日以来的新低。...
“四举措”做好环境秩序执法保障... 转自:劳动午报 近日,门头沟区城市管理综合行政执法局强化重点保障地区占道经营、生活垃圾分类、非法小广...
15项举措支持加快构建科技金融... 转自:劳动午报 新华社电 创新之花离不开金融活水的浇灌。科技部、中国人民银行等7部门近日联合发布《加...
北京公交集团6位劳模工匠讲述成... 转自:劳动午报 本报讯 (记者 盛丽)近日,北京公交集团公司工会举办了“中国梦·劳动美——风华百年 ...
向佐分享与郭碧婷婚后幸福秘诀:... 近日,向佐接受采访,向佐郭碧婷2019年结婚至今已有6年,谈到老婆和孩子,向佐脸上露出了笑容,那是他...
城市表情|大风吹 转自:千龙网时间:5月14日地点:北京前门场景:一位小朋友的伞被大风吹起。新京报记者 薛珺 摄
上市券商分红总额攀新高释放行业...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! 转自:证券日报   ...
自由现金流策略受关注 公募机构...   首批中证全指自由现金流ETF陆续上市。5月13日,招商基金管理有限公司、工银瑞信基金管理有限公司...
05月15日 新西兰元兑美元跌... Hehson外汇消息2025年05月15日,截至00时41分,外汇市场上新西兰元兑美元汇率跌破1新西...
七部门联合发布15项科技金融政... 转自:证券日报    本报记者 郭冀川    5月14日,科技部、中国人民银行、国家金融监督管理总局...
修旧利废助力降本增效 转自:劳动午报 今年以来,晋能控股煤业集团塔山煤矿公司本着“修旧利废、变废为宝、节支降耗”的原则,倡...
全球封禁华为昇腾 百万AI芯片... 5月13日,马斯克在沙特出席论坛活动。 5月13日,美国商务部正式发布文件,启动撤销拜登签署的《AI...
中关村科技园区朝阳园青年职工开... 转自:劳动午报 本报讯 (记者 刘欣欣) 近日,中关村科技园区朝阳园总工会、中关村朝阳园“数链先锋”...
市交通委对7条公交线路优化征集... 转自:劳动午报 本报讯(记者 周美玉)北京市交通委网站近日发布《关于对专30路、56路、T45等7条...