一、過濾器 1.什麼是過濾器? 過濾器是一種用於JavaWeb應用程式中的組件,它可以攔截HTTP請求和響應,以實現一些特定的功能。 過濾器可以對請求和響應進行修改,可以阻止請求進入Servlet,也可以修改響應返回給客戶端。 2.過濾器的主要作用 登錄驗證:檢查用戶是否已經登錄,如果沒有登錄則跳轉 ...
一、過濾器
1.什麼是過濾器?
過濾器是一種用於JavaWeb應用程式中的組件,它可以攔截HTTP請求和響應,以實現一些特定的功能。
過濾器可以對請求和響應進行修改,可以阻止請求進入Servlet,也可以修改響應返回給客戶端。
2.過濾器的主要作用
- 登錄驗證:檢查用戶是否已經登錄,如果沒有登錄則跳轉到登錄頁面。
- 許可權控制:檢查用戶是否有訪問某個資源的許可權,如果沒有則提示錯誤信息或者跳轉到其他頁面。
- 編碼轉換:設置請求和響應的字元編碼,解決中文亂碼問題。
- 敏感詞過濾:替換或者屏蔽掉請求參數或者響應內容中的敏感辭彙。
- 日誌記錄:記錄用戶的訪問信息,如IP地址,訪問時間,訪問路徑等。
3.過濾器的底層實現原理是基於回調函數的
當一個請求到達伺服器時,伺服器會根據請求的URL匹配相應的過濾器鏈。過濾器鏈是由一個或多個過濾器組成的,按照配置的順序依次執行。
每個過濾器都實現了Filter介面,該介面定義了三個方法:
- init(FilterConfig filterConfig):初始化方法,在過濾器創建時調用一次,可以用來獲取過濾器配置參數。
- doFilter(ServletRequest request, ServletResponse response, FilterChain chain):過濾方法,在每次請求被攔截時調用,可以用來執行具體的過濾邏輯。該方法有三個參數:request表示請求對象,response表示響應對象,chain表示過濾器鏈對象。通過調用chain.doFilter(request, response)方法,可以將請求傳遞給下一個過濾器或者目標Servlet。如果不調用該方法,則請求被阻止,不會繼續處理。
- destroy():銷毀方法,在過濾器被銷毀時調用一次,可以用來釋放資源。
使用過濾器有兩種方式:
註解方式和XML方式。
註解方式是通過在過濾器類上添加@WebFilter註解來配置過濾器的屬性,如攔截路徑,初始化參數等。
XML方式是通過在web.xml文件中添加<filter>和<filter-mapping>標簽來配置過濾器的屬性。
‘ 兩種方式都可以實現相同的功能,但是註解方式更簡潔方便。
4.過濾器的使用場景
- 防止SQL註入攻擊:通過對請求參數進行檢查和轉義,避免惡意用戶輸入SQL語句造成資料庫被篡改或泄露。
- 防止跨站腳本攻擊(XSS):通過對請求參數和響應內容進行編碼或過濾,避免惡意用戶輸入HTML或JavaScript代碼造成網頁被篡改或用戶信息被竊取。
- 防止跨站請求偽造(CSRF):通過在表單中添加隱藏欄位或者在請求頭中添加自定義欄位,併在伺服器端進行驗證,避免惡意用戶利用用戶已登錄的身份發送非法請求。
- 實現緩存機制:通過在響應頭中添加緩存相關的欄位,併在伺服器端判斷請求是否命中緩存,可以提高網站性能和用戶體驗。
- 實現壓縮機制:通過在響應頭中添加壓縮相關的欄位,併在伺服器端對響應內容進行壓縮,可以減少網路傳輸的數據量和時間。
二、攔截器
1.什麼是攔截器?
攔截器是一種用於JavaWeb應用程式中的組件,它可以在Servlet執行之前攔截HTTP請求,並對請求進行一些處理,比如登錄驗證,許可權控制,日誌記錄,編碼轉換等。
攔截器可以根據需要決定是否繼續執行Servlet或者返迴響應。
2.攔截器的底層實現原理是基於動態代理的
當一個請求到達伺服器時,伺服器會根據請求的URL匹配相應的攔截器鏈。攔截器鏈是由一個或多個攔截器組成的,按照配置的順序依次執行。
每個攔截器都實現了HandlerInterceptor介面,該介面定義了三個方法:
- preHandle(HttpServletRequest request, HttpServletResponse response, Object handler):在Servlet執行之前調用,可以對請求進行預處理,也可以返回false來阻止請求繼續執行。
- postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView):在Servlet執行之後調用,可以對響應進行後處理,也可以修改ModelAndView對象。
- afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex):在整個請求完成之後調用,可以用來釋放資源或者處理異常。
使用攔截器有兩種方式:
註解方式和XML方式。
註解方式是通過在攔截器類上添加@WebMvcConfigurer註解來配置攔截器的屬性,如攔截路徑,排除路徑等。
XML方式是通過在web.xml文件中添加mvc:interceptors標簽來配置攔截器的屬性。兩種方式都可以實現相同的功能,但是註解方式更簡潔方便。
3.攔截器的使用場景
- 登錄驗證:檢查用戶是否已經登錄,如果沒有登錄則跳轉到登錄頁面或者返回錯誤信息。
- 許可權控制:檢查用戶是否有訪問某個資源的許可權,如果沒有則提示錯誤信息或者跳轉到其他頁面。
- 日誌記錄:記錄用戶的訪問信息,如IP地址,訪問時間,訪問路徑等。
- 編碼轉換:設置請求和響應的字元編碼,解決中文亂碼問題。
- 性能監控:記錄請求的開始時間和結束時間,計算請求的處理時間和響應時間。
三、攔截器和過濾器的主要區別
- 攔截器是基於動態代理的,它可以在目標方法執行前後或者異常時進行增強處理。過濾器是基於函數回調的,它只能在請求進入或者離開容器時進行過濾操作。
- 攔截器是SpringMVC框架提供的,它只對控制器方法有效,而過濾器是Servlet規範定義的,它對所有的請求都有效,包括靜態資源。
- 攔截器可以訪問控制器方法的上下文信息,如方法參數,返回值,異常等。過濾器只能訪問請求和響應對象,不能獲取具體的業務邏輯信息。
- 攔截器可以通過返回值來控制請求是否繼續執行,如果返回false,則請求被阻止。過濾器沒有這樣的功能,只能通過轉發或者重定向來改變請求的流程。
- 攔截器可以實現多個攔截器鏈式調用,而且調用順序是可控的。過濾器也可以有多個過濾器依次執行,但是調用順序是由容器決定的。