在很多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