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

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