SpringBoot中过滤器和监听器

在很多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:监听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 {
    @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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章