springboot#filter
_
Filter不能处理用户请求,也不能对客户端生成响应。 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest。根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。在HttpServletResponse 到达客户端之前,拦截HttpServletResponse。根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。

在众多对请求进行处理的手段中,Filter过滤器也,是首先被接触到的,在JavaWeb中他就作为三大组件之一,早已被无数开发人员所熟知,同样也为无数开发人员解决了很多问题,在这些问题中有一些尤其特别的经典。比如说如下的:
- http请求/响应的字符编码控制管理
- 前端资源缓存控制管理
- 账号登陆及自动登陆的管理
- URL级别的权限控制
- 敏感词汇过滤
每次当用户鼠标的一次点击,抑或是每一次F5的点击,或者是手指从显示屏滑动刷新,一个请求就会穿越万里,来的服务端。当请求来到服务端,从没有歇息的时间,请求就会穿越由很多过滤器组成的过滤器链,换言之,请求在真正被业务逻辑处理前是会接受过滤器们的洗礼的。能完整完成洗礼的请求才有资格被业务逻辑所处理。完成业务逻辑的处理之后,就是响应了,响应如果想回到它该去的地方,也是要经过过滤器们的洗礼。有一条过滤器链他们是无法避开的。
对于过滤器而言,每一次过滤,他们真正在意的是httpRequest,httpResponse,以及把握一个合适的时机让下一位过滤器接盘。其他的他们根本不关心。
光阴似箭,日月如梭,时代在进步,技术在发展。但是有一些东西还是被传承了下来。比如Filter在SpringBoot中还是会出现。那么如何在SpringBoot中使用Filter呢?有多少种配置的方式呢?
配置方法千千万,下面两个最常见:
方法一:
通过过滤器类上的WebFilter注解 + 应用入口处的ServletComponentScan两个注解完成Filter的注册,缺点就是不能自定义多个处理器的顺序。
@WebFilter(filterName = "myFirstFilter",urlPatterns = "/*")
public class MyFilter implements Filter{ @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 过滤器要做的事情
System.err.println("S---------------------FirstFilter-------------------------");
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
httpServletResponse.setHeader("Cache-Control", "no-cache");
httpServletResponse.setDateHeader("Expires", -1);
httpServletResponse.setHeader("Pragma", "no-cache");
System.err.println("----------------------FirstFilter------------------------E"); // 完成当前过滤器需要完成的工作之后,就调用下一个过滤器吧
chain.doFilter(request, httpServletResponse);
}
}
@ServletComponentScan(basePackages = "com.hello.filter")
@SpringBootApplication
public class SpringbootShiroApplication { public static void main(String[] args) {
SpringApplication.run(SpringbootShiroApplication.class, args);
} }
方法二:
通过应用入口上添加ServletComponentScan注解+外加向spirng容器中注册FilterRegisterationBean完成Filter的注册,这样可以定义多个filter执行过滤的顺序。
public class MySecondFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.err.println("S---------------------SecondFilter-------------------------");
System.err.println("过滤器二需要做的一些处理");
System.err.println("----------------------SecondFilter------------------------E");
chain.doFilter(request, response);
}
}
@ServletComponentScan(basePackages = "com.hello.filter")
@SpringBootApplication
public class SpringbootShiroApplication { public static void main(String[] args) {
SpringApplication.run(SpringbootShiroApplication.class, args);
} @Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new MySecondFilter());
bean.addUrlPatterns("/*");
bean.setOrder(0);
return bean;
}
}
最后关于filter的生命周期,
- 应用启动时候,filter 的init方法会执行一次,之后再也不会执行;
- 每次响应,filter的doFilter会执行一次,前题是当前请求会匹配到过滤器;
- 应用关闭的时候,filter的destroy方法会执行一次。
springboot#filter的更多相关文章
- SpringBoot 2.x (6):使用Filter、Servlet、Listener
Filter的使用: 1.常见的默认Filter有: characterEncodingFilter hiddenHttpMethodFilter httpPutFormContentFilter r ...
- springboot中使用filter用配置类方式
在03-springboot-web的Filter包下,创建HeFilter类 代码示例: package com.bjpowernode.springboot.filter; import java ...
- springboot中使用filter
通过注解的方式实现filter过滤器. 创建Filter包,并在该包下创建MyFilter 示例代码: package com.bjpowernode.springboot.filter; impor ...
- SpringBoot学习(八)-->SpringBoot之过滤器、监听器
本文将直接使用@WebFilter和@WebListener的方式,完成一个Filter 和一个 Listener. 过滤器(Filter)和 监听器(Listener)的注册方法和 Servlet ...
- spring boot 与 filter
spring boot 里面用拦截器好像比用过滤器多一些. 在过滤器中, 并不能获取到action的相关信息, 会造成很多的麻烦和功能欠缺. 那, 这里就用过滤器做一个小栗子, 实际使用过程中, 不会 ...
- springboot用于web开发
1.使用SpringBoot:1)创建SpringBoot应用,选中我们需要的模块:2)SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来3)自己编写业务代码 ...
- Springboot源码分析之TypeFilter魔力
摘要: 在平常的开发中,不知道大家有没有想过这样一个问题,为什么我们自定义注解的时候要使用spring的原生注解(这里指的是类似@Component,@Service........),要么就是 随便 ...
- springBoot 基础入门
来处:是spring项目中的一个子项目 优点 (被称为搭建项目的脚手架) 减少一切xml配置,做到开箱即用,快速上手,专注于业务而非配置 从创建项目上: -- 快速创建独立运 ...
- Spring Boot 整合 Web 开发
这一节我们主要学习如何整合 Web 相关技术: Servlet Filter Listener 访问静态资源 文件上传 文件下载 Web三大基本组件分别是:Servlet,Listener,Filte ...
随机推荐
- [python]ubuntu下的python2和python3
在终端分别输入python,python2,python3python和python2默认都是python2python3才是python3 Ubuntu下是默认没有pip的,需要自己手动安装 sud ...
- docker原理学习-环境搭建
1. mac下用VMware虚拟机安装ubunt16.04 2. ubuntu安装并启动ssh服务 3. 用mac终端ssh到虚拟机中 ssh didiyu@ip 输入登陆密码
- windows服务使用和控制启停
https://www.cnblogs.com/mq0036/p/7875864.html
- 按钮UIButton的使用
一.使用概要 当添加一个按钮到你的界面,执行以下步骤: 1.在创建时设置按钮的类型. 2.提供一个标题字符串或图像,为您的内容适当调整按钮的大小. 3.连接一个或多个操作按钮的方法. 4.设置自动布局 ...
- Java8使用Stream优雅地处理集合
说明 集合和数组是我们经常会用到的数据结构,在jdk1.8之前,集合和数组的处理并不是很便捷.但是到了JDK1.8之后,使用Stream处理集合会使代码变得更加的简洁明了.作为一名开发者,其实很有必要 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:在元素获取焦点时显示(如:键盘操作的用户)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Java Hashtable遍历与方法使用
参考文档 我参考了Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例,阅读了jdk 1.8的源码 Hashtable的继承关系 Hashtable继承了Dictionary类, ...
- 「PA2014」Kuglarz
传送门 memset0好评 解题思路 其实这是一道图论题 不难发现,如果知道了 \(\sum1...i\) 和 \(\sum1...j\) 的奇偶性,那么就可以得知 \(\sum i+1...j\) ...
- JVM源码分析-类加载场景实例分析
A类调用B类的静态方法,除了加载B类,但是B类的一个未被调用的方法间接使用到的C类却也被加载了,这个有意思的场景来自一个提问:方法中使用的类型为何在未调用时尝试加载?. 场景如下: public cl ...
- saveToken介绍二
Struts的Token(令牌)机制能够很好的解决表单重复提交的问题,基本原理是:服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配.在处理完该 ...