在很多Web项目中,都会用到过滤器(Filter),如参数过滤、防止SQL注入、防止页面攻击、空参数矫正、Token验证、Session验证、点击率统计等。

认识过滤器

1.为什么要使用过滤器
在Web开发中,常常会有这样的需求:在所有接口中去除用户输入的非法字符,以防止引起业务异常。要实现这个功能,可以有很多方法,比如

方法 内容
方法1 在前端参数传入时进行校验,先过滤掉非法字符,然后返回用户界面提示用户重新输入
方法2 后端接收前端没有过滤的数据,然后过滤非法字符
方法3 利用Filter处理项目中所有非法字符

前两种方法实现时会存在重复代码,因为每个前端页面或后端都需要处理,这样会导致代码难以维护。如果用过滤器来实现,则只需要用过滤器对所有接口进行过滤处理。这样既方便,又不会产生冗余代码。

2.使用Filter的步骤
1)新建类,实现Filter抽象类
2)重写init、doFilter、destroy方法
3)在Spring Boot入口中添加注解@ServletComponentScan,以注册Filter

下面说明一下编写过滤器类的具体逻辑
如果有多个过滤器,可以通过注解@Order来设置过滤器的执行顺序,序号越小,越早被执行。

package com.example.demo.Filter;
import lombok.Builder;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@Order(1)
//URL过滤设置
@WebFilter(filtername="FilterDemo01",urlPatterns = "/*")public class FilterDemo01 implements Filter{@Overridepublic void init(FilterConfig filterConfig)throws ServletException{//init逻辑,该init将在服务器启动时被调用}@Overridepublic void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain)throws IOException,ServletException{//请求(request)处理逻辑//请求(request)封装逻辑//chain重新写回request和response}@Overridepublic void destroy(){//重写destroy逻辑,该逻辑将在服务器关闭时被调用}
}

实现过滤器

实验结果
因为通过注解@WebFilter(urlPatterns="/*")定义了urlPatterns的变量值为 “ * ”,代表所有路径。所以用户在访问本项目下的任何路径的页面时,此过滤器都会在控制台输出一下信息

拦截器

不需要添加依赖
1.新建拦截器类
FilterDemo01.java

package com.example.demo.Filter;
import lombok.Builder;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;//作用范围
@WebFilter(urlPatterns = "/*")public class FilterDemo01 implements Filter{@Overridepublic void init(FilterConfig filterConfig)throws ServletException{}@Overridepublic void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain)throws IOException,ServletException{System.out.println("拦截器");filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy(){}
}

2.在入口类中开启Servlet支持
直接在入口类加入@ServletComponentScan即可。
ServletApplication.java

package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;@SpringBootApplication
@ServletComponentScan
public class ServletApplication {public static void main(String[] args) {SpringApplication.run(ServletApplication.class, args);}}

认识监听器

监听器(Listener)用于监听Web应用程序中某些对象或信息的创建、销毁、增加、修改、删除等动作,然后做出相应的响应处理。当对象的状态发生变化时,服务器自动调用监听器的方法,监听器常用于统计在线人数、在线用户、系统加载时的信息初始化等。

监听器有如下三种类型
1.监听ServletContext,Request,Session作用域的创建和销毁

  • ServletContextListener:监听ServletContext
  • HttpSessionListener:监听新的Session创建事件
  • ServletRequestListener:监听ServletRequest的初始化和销毁

2.监听ServletContext,Request,Session作用域中属性的变化(增加、修改、删除)

  • ServletContextAttributeListener:监听Servlet上下文参数的变化
  • HttpSessionAttributeListener:监听HttpSession参数的变化
  • ServletRequestAttributeListener:监听ServletRequest参数的变化

3.监听HttpSession中对象状态的改变(被绑定、解除绑定、钝化、活化)

  • HttpSessionBindingListener:监听HttpSession,并绑定及解除绑定
  • HttpSessionActivationListener:监听钝化和活动的HttpSession状态改变

实现监听器

实验结果
启动项目后,在控制台会输出如下信息

ServletContex 初始化
Apache Tomcat/9.0.36

1.创建监听类
在上面过滤器项目的基础上,创建文件Listener,并创建如下java文件

FilterDemo02.java

package com.example.demo.listener;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import  javax.servlet.http.HttpSessionListener;
@WebListener
public class FilterDemo02 implements  ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent){System.out.println("ServletContex 初始化");System.out.println(servletContextEvent.getServletContext().getServerInfo());}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent){System.out.println("ServletContex 销毁");}
}

2.开启监听类Bean扫描
在入口类中,添加注解@ServletComponentScan

SpringBoot中过滤器和监听器相关推荐

  1. springboot处理参数再转发请求_SpringBoot图文教程6—SpringBoot中过滤器的使用

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文系列教程技术大纲 SpringBoot 图文教程系列文章 ...

  2. java中过滤器、监听器、拦截器的区别

    1.过滤器:所谓过滤器顾名思义是用来过滤的,在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的actio ...

  3. springBoot的过滤器,监听器,拦截器

    概述 在开发中,我们经常要考虑一些问题,对敏感词进行过滤,用户是否已经登录,是否需要对他的请求进行拦截,或者领导问现在在线人数有多少人?我们如何实现这些功能哪 @WebFilterpackage co ...

  4. springboot中的过滤器、拦截器、监听器整合使用

    文章目录 controller层 过滤器 拦截器 拦截器介绍 使用拦截器 监听器 监听器介绍 使用监听器 修改启动类 controller层 用于测试 @RestController public c ...

  5. SpringBoot中AOP实现落地——Filter(过滤器)、Intercepter(拦截器)、Aspect(Spring AOP)

    文章目录 一.一切要从Servlet说起 1.1什么是Servlet 1.2为什么需要Servlet 1.3Servlet如何响应用户请求 1.4Servlet与Tomcat处理请求的流程 1.5Se ...

  6. springboot中配置过滤器以及可能出现的问题

    在springboot添加过滤器有两种方式: 1.通过创建FilterRegistrationBean的方式(建议使用此种方式,统一管理,且通过注解的方式若不是本地调试,如果在filter中需要增加c ...

  7. java 过滤js事件_java中的过滤器与监听器

    过滤器: Filter本身并不生成请求和响应对象,只是提供过滤功能. Filter能够在Servlet被调用之前检查Request对象,并修改Request Header和Request内容:在Ser ...

  8. java中的过滤器与监听器

    过滤器: Filter本身并不生成请求和响应对象,只是提供过滤功能. Filter能够在Servlet被调用之前检查Request对象,并修改Request Header和Request内容:在Ser ...

  9. Springboot应用中过滤器chain.doFilter后设置header无效

    Springboot应用中过滤器chain.doFilter后设置header无效 本文是在使用过滤器添加动态header过程中遇到设置header无效,经过研究源码而产生. 因为特殊需求,自定义的h ...

最新文章

  1. v2视频服务器退出系统怎么启动,V2视频会议系统入门操作手册.doc
  2. Cisco IOS的故障恢复方法
  3. 高并发应用场景下的负载均衡与故障转移实践,AgileEAS.NET SOA 负载均衡介绍与实践...
  4. Linux内核网络设备驱动
  5. Spring boot 将配置文件属性注入到一个bean中
  6. android 打开谷歌导航,国内开启google位置记录功能/android版google maps 7+上,恢复位置记录功能在国内使用(需root)...
  7. 地域跨度入手的8zsb
  8. 巧用Squid的ACL和访问列表实现高效访问控制
  9. [LeetCode] 159. Longest Substring with At Most Two Distinct Characters 最多有两个不同字符的最长子串...
  10. Specify 的含义 ------ 转载
  11. java 方法调用表达式_java lambda怎么表达式判断被调用接口名称和接口中方法
  12. c店店铺名怎么用旗舰店_大发现!三利和洁丽雅2大国民毛巾品牌也有1688店铺!...
  13. C# Winfrom Chart 图表控件 柱状图、折线图
  14. 怎么把多个excel表格合成一个_「Excel」合并多个表格,可以快速搞定啦
  15. geoserver发布shp格式的图层 实现步骤(含图).doc
  16. php作为客户端websocket,使用PHP客户端连接到websocket
  17. 京东上位2018年财富中国500强民企第一席 首次实现全年盈利
  18. JAVA鞍山丘比特房屋租赁管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  19. c语言10个选手10个评委,C语言歌星大奖赛为参赛的选手打分.doc
  20. 物理科普读物推荐:《物理精神》——人类文明创新的原动力

热门文章

  1. Visual Studio 压力测试注意点
  2. KMP,深入讲解next数组的求解(转载)
  3. curl访问nagios中Host Status Details For All Host Groups页面的方法
  4. 微信小程序码buffer转为图片php,微信小程序将网络图片转成base64数据
  5. 列举ospf的5种报文类型_9种语言的应用场景,程序员的候选清单,你最看好哪一门语言...
  6. 【STM32】typedef 类型及配合结构体使用
  7. 2_指令集、体系架构、微架构
  8. linux下SVN配置笔记(转)
  9. TCL foreach的用法
  10. 【测试】ESP32天线信号强度比较,小龟小车A2天线esp32cam板载外置天线测试数据...