_

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方法会执行一次。

最新文章

  1. dubbox rest服务
  2. 理解View与Model分离
  3. Entity FrameWork 中使用Expression<Func<T,true>>访问数据库性能优化
  4. Java 提示 JRE unbound 或者 Tomcat unbound 解决方法
  5. Windows转到linux中,文件乱码,文件编码转换
  6. struts2.3.15.1 中jsp:include与jsp:forward的用法
  7. Codeforces 551C GukiZ hates Boxes 二分答案
  8. [刷题]算法竞赛入门经典(第2版) 5-6/UVa1595 - Symmetry
  9. Debian系统简要说明
  10. 为什么要使用“var me=this”这样的写法
  11. python安装第三方库报错visual c++ 14.0 is required
  12. CH2906 武士风度的牛(算竞进阶习题)
  13. Qt编写自定义控件插件开放动态库dll使用(永久免费)
  14. C#爬虫基本知识
  15. 初试Django的缓存系统
  16. Linux说明书 - man浅谈
  17. 第二个spring冲刺第4天
  18. tcp 大文件上传 ,切换目录 及登陆文件加盐处理
  19. JBPM学习(四):运行流程实例
  20. ESP8266传送文件设置和操作

热门文章

  1. redhat 7.6 rpm ,yum ,编译安装
  2. python 基础之列表的操作和列表的相关函数
  3. 零基础学完Python的7大就业方向,哪个赚钱多?
  4. JMeter配置JDBC测试SQL Server/MySQL/ORACLE
  5. python正则表达式错误集
  6. Keras入门——(3)生成式对抗网络GAN
  7. JS动态获取 Url 参数
  8. ios 获取当前系统时间
  9. Spark 读 Hive(不在一个 yarn 集群)
  10. WPF学员管理系统