SpringBoot中过滤器和监听器

    技术2022-07-10  100

    在很多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{ @Override public void init(FilterConfig filterConfig)throws ServletException{ //init逻辑,该init将在服务器启动时被调用 } @Override public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain)throws IOException,ServletException{ //请求(request)处理逻辑 //请求(request)封装逻辑 //chain重新写回request和response } @Override public 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{ @Override public void init(FilterConfig filterConfig)throws ServletException{ } @Override public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain)throws IOException,ServletException{ System.out.println("拦截器"); filterChain.doFilter(servletRequest,servletResponse); } @Override public 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:监听ServletContextHttpSessionListener:监听新的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 { @Override public void contextInitialized(ServletContextEvent servletContextEvent){ System.out.println("ServletContex 初始化"); System.out.println(servletContextEvent.getServletContext().getServerInfo()); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent){ System.out.println("ServletContex 销毁"); } }

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

    Processed: 0.014, SQL: 9